Megosztás a következőn keresztül:


Kivételek és események szabályozása

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
hc

É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
ssec

Egylépéses kivétel

Törik

bpe
bpec

Töréspont-kivétel

Törik

cce
cc

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.