Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A felhasználói és kernel módú alkalmazások kivételei többféle módszerrel is elkaphatók és kezelhetők. Az aktív hibakereső, a postmortem hibakereső vagy a belső hibakezelési rutin mind gyakori módszer a kivételek kezelésére.
A különböző kivételkezelők sorrendjéről további információt a Postmortem hibakeresés engedélyezése című témakörben talál.
Ha a Microsoft Windows operációs rendszere lehetővé teszi a hibakereső számára a kivétel kezelését, a kivételt létrehozó alkalmazás a hibakeresőbe kerül . Vagyis az alkalmazás leáll, és a hibakereső aktívvá válik. A hibakereső ezután valamilyen módon képes kezelni a kivételt, vagy elemezni a helyzetet. A hibakereső ezután befejezheti a folyamatot, vagy folytathatja a futtatását.
Ha a hibakereső figyelmen kívül hagyja a kivételt, és engedélyezi az alkalmazás futtatását, az operációs rendszer más kivételkezelőket keres, mintha nem lett volna hibakereső. Ha a kivételt kezelik, az alkalmazás továbbra is fut. Ha azonban a kivétel továbbra is kezeletlen marad, a hibakeresőnek ez után második lehetősége nyílik a helyzet kezelésére.
Hibakereső használata kivétel elemzéséhez
Ha egy kivétel vagy esemény betör a hibakeresőbe, a hibakeresővel megvizsgálhatja a futtatott kódot és az alkalmazás által használt memóriát. Bizonyos mennyiségek módosításával vagy az alkalmazás egy másik pontjára való ugrással eltávolíthatja a kivétel okát.
A végrehajtást gh (Go with Exception Handled) vagy gn (Go with Exception Not Handled) paranccsal folytathatja .
Ha a hibakereső második lehetőségében kiadja a gn parancsot a kivétel kezelésére, az alkalmazás véget ér.
Kernel-Mode kivételek
A kernel módú kódban előforduló kivételek súlyosabbak, mint a felhasználói módú kivételek. Ha a rendszer nem kezeli a kernelmódú kivételeket, hibaellenőrzést ad ki, és a rendszer leáll.
A felhasználói módú kivételekhez hasonlóan, ha egy kernel módú hibakereső csatlakozik a rendszerhez, a hibakeresőt a hibaellenőrzési képernyő (más néven kék képernyő) megjelenése előtt értesíti a rendszer. Ha nincs hibakereső csatlakoztatva, megjelenik a hibaellenőrzési képernyő. Ebben az esetben az operációs rendszer összeomlási memóriaképfájlt hozhat létre.
Kivételek és események szabályozása a hibakeresőből
A hibakereső konfigurálható úgy, hogy adott kivételekre és eseményekre adott módon reagáljon.
A hibakereső beállíthatja az egyes kivételek vagy események törési állapotát:
Az esemény a hibakeresőbe való betörést okozhat, amint bekövetkezik (az "első esély").
Az esemény közbeavatkozhat, miután más hibakezelőknek lehetőségük volt válaszolni (a "második esély").
Az esemény üzenetet is küldhet a hibakeresőnek, de folytathatja a végrehajtást.
A hibakereső figyelmen kívül hagyhatja az eseményt.
A hibakereső az egyes kivételek és események kezelési állapotát is beállíthatja. A hibakereső kezelt vagy kezeletlen kivételként kezelheti az eseményt. (Természetesen azok az események, amelyek valójában nem hibák, nem igényelnek semmilyen kezelést.)
A törési állapotot és a kezelési állapotot az alábbi műveletek egyikével szabályozhatja:
Használja az SXE, az SXD, az SXN vagy az SXI parancsot a Hibakereső parancs ablakban.
(CDB és NTSD) A parancssorban használja az -x, -xe, -xd, -xn vagy -xi lehetőséget.
(CDB, NTSD és KD) Használja az sxe vagy sxd kulcsszót a Tools.ini fájlban.
(Csak WinDbg) A Hibakeresés menü Eseményszűrők elemére kattintva nyissa meg az Eseményszűrők párbeszédpanelt, majd válassza ki a kívánt beállításokat.
Az SX\* parancs, az -x\* parancssori lehetőség és az sx\* Tools.ini kulcsszó általában a megadott esemény törésállapotát állítja be. Hozzáadhatja a -h beállítást, hogy a kezelési állapot be legyen állítva.
Négy speciális eseménykód (cc, hc, bpec és ssec) létezik, amelyek a megszakítási állapot helyett mindig a kezelési állapotot adják meg.
A legutóbbi kivételt vagy eseményt a .lastevent (Utolsó esemény megjelenítése) paranccsal jelenítheti meg.
Szünet állapot szabályozása
Ha egy kivétel vagy esemény törésállapotát állítja be, az alábbi lehetőségeket használhatja.
| Parancs | Állapot neve | Leírás |
|---|---|---|
| SXE vagy -xe | törés (Engedélyezve) |
Amikor ez a kivétel bekövetkezik, a program azonnal belép a hibakeresőbe. Ez a betörés a többi hibakezelő aktiválása előtt következik be. Ezt a módszert első esély kezelésnek nevezzük. |
| SXD vagy -xd | Második esély szünet (Letiltva) |
A hibakereső nem állítja meg a futását az ilyen típusú első esélyű kivételnél (bár megjelenik egy üzenet). Ha más hibakezelők nem tudják kezelni ezt a kivételt, a végrehajtás leáll, és a rendszer a hibakeresőbe kerül. Ezt a metódust második esélykezelésnek nevezzük. |
| SXN vagy -xn | Kimenet (Értesítés) |
Ha ez a kivétel történik, a célalkalmazás egyáltalán nem törik be a hibakeresőbe. Megjelenik azonban egy üzenet, amely tájékoztatja a felhasználót erről a kivételről. |
| SXI vagy -xi | Semmibe vesz |
Ha ez a kivétel történik, a célalkalmazás nem törik be a hibakeresőbe, és nem jelenik meg üzenet. |
Ha egy SX* beállítás nem jelez elő kivételt, a célalkalmazás a második esély szerint a hibakeresőbe kerül. Az események alapértelmezett állapota a témakör következő "Eseménydefiníciók és alapértelmezések" szakaszában található.
Ha a WinDbg grafikus felülettel szeretné beállítani a törésállapotot, a Hibakeresés menü Eseményszűrők menüjében válassza ki a kívánt eseményt az Eseményszűrők párbeszédpanel listájából, majd válassza az Engedélyezve, Letiltva, Kimenet vagy Figyelmen kívül hagyás lehetőséget.
Kezelés állapotának szabályozása
Minden esemény kezeletlennek minősül, kivéve, ha a gh (Go with Exception Handled) parancsot használja.
Minden kivétel kezeletlennek minősül, kivéve, ha az sx\* parancsot a -h beállítással együtt használja.
Emellett az SX* beállításai konfigurálhatják az érvénytelen leírók kezelési állapotát, a STATUS_BREAKPOINT törésutasításokat és az egylépéses kivételeket. (Ez a konfiguráció eltér a töréskonfigurációtól.) A törésállapot konfigurálásakor ezek az események ch, bpe és sse nevet kapnak. A kezelési állapotuk konfigurálásakor ezek az események hc, bpec és ssec néven lesznek elnevezve. (Az események teljes listáját az alábbi "Eseménydefiníciók és alapértelmezett beállítások" szakaszban találja.)
A CTRL+C esemény (cc) kezelési állapotát konfigurálhatja, a törési állapotát azonban nem. Ha egy alkalmazás CTRL+C eseményt kap, az alkalmazás mindig a hibakeresőre tör.
Ha az SX* parancsot cc, hc, bpec és ssec eseményeken használja, vagy ha az SX* parancsot a kivétel -h beállításával együtt használja, a következő műveletek történnek.
| Parancs | Állapot neve | Leírás |
|---|---|---|
SXE |
Kezelt |
Az esemény akkor lesz kezelve, amikor a végrehajtás folytatódik. |
SXD,SXN,SXI |
Nincs kezelve |
Az esemény nem lesz kezelve, amikor a végrehajtás folytatódik. |
Ha a WinDbg grafikus felülettel szeretné beállítani a kezelési állapotot, válassza az Eseményszűrők lehetőséget a Hibakeresés menüben, válassza ki a kívánt eseményt az Eseményszűrők párbeszédpanel listájából, majd válassza a Kezelt vagy a Nem kezelt lehetőséget.
Automatikus parancsok
A hibakereső lehetővé teszi az automatikusan végrehajtott parancsok beállítását is, ha az esemény vagy kivétel a hibakeresőbe való betörést okoz. Beállíthat egy parancssztringet az első véletlen töréshez, és egy parancssztringet a második véletlen töréshez. Ezeket a sztringeket az SX\* paranccsal vagy a Hibakeresés | Eseményszűrők paranccsal állíthatja be. Minden parancssztring tartalmazhat pontosvesszővel elválasztott parancsokat.
Ezeket a parancsokat a rendszer a törés állapotától függetlenül végrehajtja. Vagyis ha a törés állapota "Figyelmen kívül hagyva" állapotú, a parancs továbbra is végrehajtásra kerül. Ha a törés állapota "Második esélyű törés", akkor a rendszer a kivétel első előfordulásakor végrehajtja az első esélyű parancsot, mielőtt a többi kivételkezelőt hívnák. A parancssztring egy végrehajtási paranccsal végződhet, például g (Go), gh (Ugrás kivétellel kezelve) vagy gn (Ugrás kivétel nem kezelve).
Eseménydefiníciók és alapértelmezett beállítások
Az alábbi kivételek törési állapotát vagy kezelési állapotát módosíthatja. A rendszer az alapértelmezett törési állapotot jelzi.
A következő kivételek alapértelmezett kezelési állapota mindig "Nem kezelt". Legyen óvatos az állapot módosításával. Ha ezt az állapotot "Kezelt" értékre módosítja, a rendszer kezeli az ilyen típusú első és a második esélyű kivételeket, és ez a konfiguráció minden kivételkezelési rutint felülmúl.
| Eseménykód | Értelmezés | Alapértelmezett szünetállapot |
|---|---|---|
asrt |
Helyességi hiba |
Törik |
av |
Hozzáférés megsértése |
Törik |
dm |
Helytelenül megadott adatok |
Törik |
Dz |
Egész szám osztás nullával |
Törik |
c0000008e |
Lebegőpontos osztás nullával |
Törik |
Eh |
C++ EH-kivétel |
Második esélyű szünet |
Gp |
Biztonsági oldal megsértése |
Törik |
ii |
Érvénytelen utasítás |
Második esélyű szünet |
iov |
Egész szám túlfutása |
Törik |
ip |
A lapon belüli I/O-hiba |
Törik |
Isc |
Érvénytelen rendszerhívás |
Törik |
lsq |
Érvénytelen zárolási sorozat |
Törik |
sbo |
Verempuffer túlcsordult |
Törik |
Sov |
Verem túlcsordulás |
Törik |
wkd |
Ébresztési hibakereső |
Törik |
Aph |
Alkalmazás lefagy Ez a kivétel akkor aktiválódik, ha a Windows operációs rendszer arra a következtetésre jut, hogy egy folyamat nem válaszol (vagyis le van függesztve). |
Törik |
3c |
Gyermek alkalmazásának befejezése |
Második esélyű szünet |
ch |
Érvénytelen azonosító |
Törik |
Szám |
Számozott kivétel |
Második esélyű szünet |
Megjegyzés Az ah (Assertion Handling) paranccsal felülbírálhatja az asrt törési állapotát egy adott címnél. A ch és hc eseménykódok ugyanarra a kivételre vonatkoznak. A törési állapot vezérlésekor használja a sx* ch-t. A kezelési állapot szabályozása során használja az sx* hc-t.
Az alábbi kivételek törési állapotát vagy kezelési állapotát módosíthatja. A rendszer az alapértelmezett törési állapotot jelzi.
A következő kivételek alapértelmezett kezelési állapota mindig "Kezelt". Mivel ezek a kivételek a hibakeresővel való kommunikációra szolgálnak, általában nem szabad "Nem kezelt" állapotra módosítani az állapotukat. Ez az állapot miatt más kivételkezelők is elkapják a kivételeket, ha a hibakereső figyelmen kívül hagyja őket.
Az alkalmazások DBG_COMMAND_EXCEPTION (dbce) használatával kommunikálhatnak a hibakeresővel. Ez a kivétel hasonló a törésponthoz, de az SX* paranccsal adott módon reagálhat a kivétel bekövetkezésekor.
| Eseménykód | Értelmezés | Alapértelmezett szünetállapot |
|---|---|---|
dbce |
Speciális hibakereső parancskivétel |
Hagyd figyelmen kívül |
vcpp |
Speciális Visual C++ kivétel |
Hagyd figyelmen kívül |
Wos |
WOW64 egylépéses kivétel |
Törik |
wob |
WOW64 töréspont kivétel- |
Törik |
Sse |
Egylépéses kivétel |
Törik |
bpe |
Töréspont-kivétel |
Törik |
cce |
CTRL+C vagy CTRL+BREAK Ez a kivétel akkor aktiválódik, ha a cél egy konzolalkalmazás, és a CTRL+C vagy a CTRL+BREAK billentyűkombinációt adja át a rendszer. |
Törik |
Jegyzet Az előző tábla utolsó három kivétele két különböző eseménykóddal rendelkezik. A törés állapotuk szabályozásához használja az sse, bpe és cce elemeket. A kezelési állapot szabályozásához használja a ssec, a bpec és a cc protokollt.
A felügyelt kód hibakeresése során az alábbi kivételek hasznosak.
| Eseménykód | Értelmezés | Alapértelmezett állapot |
|---|---|---|
Clr |
Gyakori nyelvi futtatókörnyezeti kivétel |
Második esélyű szünet Nincs kezelve |
clrn |
Gyakori nyelvi futtatókörnyezeti értesítési kivétel |
Második esélyű szünet Kezelték (assuming the context is passive past tense, meaning "was handled"). |
Az alábbi események megszakítási állapotát módosíthatja. Mivel ezek az események nem kivételek, a kezelési állapotuk irreleváns.
| Eseménykód | Értelmezés | Alapértelmezett szünetállapot |
|---|---|---|
ser |
Rendszerhiba |
Hagyd figyelmen kívül |
cpr[:Folyamat] |
Folyamat létrehozása Az esemény törésállapotának beállítása csak a felhasználói módú hibakeresésre vonatkozik. Ez az esemény nem kernel módban fordul elő. Ezt az eseményt csak akkor szabályozhatja, ha aktiválta a gyermekfolyamatok hibakeresését a CDB-ben vagy a WinDbg-ben az -oparancssori kapcsolóval vagy a .childdbg (Gyermekfolyamatok hibakeresése) paranccsal. A folyamatnév tartalmazhat egy választható fájlnévkiterjesztést és egy csillagot () vagy kérdőjelet (?) helyettesítő karakterként. A hibakereső csak a legutóbbi cpr beállítást emlékszik meg. A különálló folyamatok külön beállításai nem támogatottak. Adjon meg kettőspontot vagy szóközt cpr és Process között. Ha a folyamat nincs megadva, a beállítás minden gyermekfolyamat-létrehozásra érvényes. |
Hagyd figyelmen kívül |
epr[:Folyamat] |
Folyamat befejezése Az esemény törésállapotának beállítása csak a felhasználói módú hibakeresésre vonatkozik. Ez az esemény nem kernel módban fordul elő. Ezt az eseményt csak akkor szabályozhatja, ha aktiválta a gyermekfolyamatok hibakeresését a CDB-ben vagy a WinDbg-ben az -oparancssori kapcsolóval vagy a .childdbg (Gyermekfolyamatok hibakeresése) paranccsal. A folyamatnév tartalmazhat egy választható fájlnévkiterjesztést és egy csillagot () vagy kérdőjelet (?) helyettesítő karakterként. A hibakereső csak a legutóbbi epr beállítást emlékszik vissza. A különálló folyamatok külön beállításai nem támogatottak. Adjon meg kettőspontot vagy szóközt epr és Process között. Ha a folyamat nincs megadva, a beállítás minden gyermekfolyamat-kilépésre érvényes. |
Hagyd figyelmen kívül |
ct |
Szál létrehozása |
Hagyd figyelmen kívül |
et |
Szál kilépése |
Hagyd figyelmen kívül |
ld[:Modul] |
Modul betöltése Ha a Modult adja meg, a törés akkor következik be, amikor az ilyen nevű modul be van töltve. A modul megadhatja a modul nevét vagy címét. Ha a nevet használja, a Modul számos helyettesítő karaktert és azonosítót tartalmazhat. (A szintaxissal kapcsolatos további információkért lásd a karakterlánc helyettesítő karakterek szintaxisát.) A hibakereső csak a legutóbbi ld beállítást emlékszik meg. A különálló modulok külön beállításai nem támogatottak. Adjon meg kettőspontot vagy szóközt ld és Modul között. Ha a modul nincs megadva, az esemény bármelyik modul betöltésekor aktiválódik. |
Kimenet |
ud[:Modul] |
Modul kiürítése Ha a Modult adja meg, a törés akkor következik be, ha az ezzel a névvel vagy ezen az alapcímmel rendelkező modul ki van ürítve. A modul megadhatja a modul nevét vagy címét. Ha a nevet használja, a Modul lehet pontos név, vagy tartalmazhat helyettesítő karaktereket. Ha a modul pontos név, a rendszer azonnal egy alapcímre oldja fel az aktuális hibakereső modullistával, és címként tárolja. Ha a modul helyettesítő karaktereket tartalmaz, a mintasztring megmarad későbbi egyeztetésre, amikor kioldási események bekövetkeznek. Ritkán előfordul, hogy a hibakereső nem rendelkezik névinformációval a kirakási eseményekhez, és csak az alapcím alapján azonosítja azokat. Ezért, ha Module helyettesítő karaktereket tartalmaz, a hibakereső nem tud névegyeztetést végrehajtani ebben a konkrét kipakolási esetben, és megszakad, amikor bármelyik modult kipakolják. A hibakereső csak a legutóbbi ud beállítást emlékszik meg. A különálló modulok külön beállításai nem támogatottak. Adjon meg kettőspontot vagy szóközt ud és Modul között. Ha a modul nincs megadva, az esemény bármelyik modul betöltésekor aktiválódik. |
Kimenet |
out[:Output] |
Célalkalmazás kimenete Ha kimenetet ad meg, a törés csak akkor következik be, ha a megadott mintának megfelelő kimenet érkezik. A kimenet számos helyettesítő karaktert és azonosítót tartalmazhat. (A szintaxissal kapcsolatos további információkért lásd a karakterlánc helyettesítő karakterek szintaxisát.) A kimenet azonban nem tartalmazhat kettőspontot vagy szóközt. Az egyezés nem érzékeny a kis- és nagybetűkre. Adjon meg kettőspontot vagy szóközt az out és a kimenet között. |
Hagyd figyelmen kívül |
ibp |
Kezdeti töréspont (Ez az esemény a hibakeresési munkamenet elején és a célszámítógép újraindítása után következik be.) |
Felhasználói módban: Törik. Ezt az állapotot a -gparancssori beállítással "Mellőzés" értékre módosíthatja. Kernel módban: Hagyd figyelmen kívül. Ezt az állapotot többféle módszerrel "Engedélyezve" értékre módosíthatja. Az állapot módosításáról további információt a célszámítógép összeomlása és újraindítása című témakörben talál. |
iml |
Kezdeti modulbetöltés (Csak kernel mód) |
Figyelmen kívül hagy. Ezt az állapotot többféle módszerrel "Break" értékre módosíthatja. Az állapot módosításáról további információt a célszámítógép összeomlása és újraindítása című témakörben talál. |