Dela via


Kontrollera undantag och händelser

Du kan fånga och hantera undantag i program i användarläge och kernelläge med en mängd olika metoder. Ett aktivt felsökningsprogram, ett felsökningsprogram för postmortem eller en intern felhanteringsrutin är alla vanliga sätt att hantera undantag.

Mer information om prioritetsordningen för dessa olika undantagshanterare finns i Aktivera postmortem-felsökning.

När Microsoft Windows-operativsystemet tillåter att ett felsökningsprogram hanterar ett undantag, bryter programmet som genererade undantaget in i felsökningsprogrammet. Det vill sa att programmet stoppas och felsökningsprogrammet blir aktivt. Felsökningsprogrammet kan sedan hantera undantaget på något sätt eller analysera situationen. Felsökningsprogrammet kan sedan avsluta processen eller låta den fortsätta att köras.

Om felsökningsprogrammet ignorerar undantaget och låter programmet fortsätta att köras letar operativsystemet efter andra undantagshanterare som om det inte fanns något felsökningsprogram. Om undantaget hanteras fortsätter programmet att köras. Men om undantaget förblir ohanterat ges felsökningsprogrammet en andra möjlighet att hantera situationen.

Använda felsökningsprogrammet för att analysera ett undantag

När ett undantag eller en händelse bryter sig in i felsökningsprogrammet kan du använda felsökningsprogrammet för att undersöka koden som körs och det minne som programmet använder. Genom att ändra vissa kvantiteter eller hoppa till en annan punkt i programmet kanske du kan ta bort orsaken till undantaget.

Du kan återuppta körningen genom att utfärda kommandot "gh" ("Go med hanterat undantag") eller "gn" ("Go med ohanterat undantag").

Om du utfärdar gn-kommandot i felsökarens andra möjlighet att hantera undantaget avslutas programmet.

Kernel-Mode undantag

Undantag som inträffar i kernellägeskod är allvarligare än undantag i användarläge. Om undantag i kernelläge inte hanteras utfärdas en buggkontroll och systemet stoppas.

Precis som med användarlägesfel meddelas felsökaren innan felsökningsskärmen (även kallad blå skärm) visas om ett felsökningsprogram i kernelläge är kopplat till systemet. Om inget felsökningsprogram är kopplat visas skärmen för felkontroll. I det här fallet kan operativsystemet skapa en kraschdumpfil.

Kontrollera undantag och händelser från felsökningsprogrammet

Du kan konfigurera felsökningsprogrammet så att det reagerar på angivna undantag och händelser på ett visst sätt.

Felsökningsprogrammet kan ange brytstatus för varje undantag eller händelse:

  • Händelsen kan orsaka en inbrytning i felsökningsprogrammet så snart den inträffar (den "första chansen").

  • Händelsen kan brytas in efter att andra felhanterare har fått möjlighet att svara ("andra chansen").

  • Händelsen kan också skicka ett meddelande till felsökaren men fortsätta att köras.

  • Felsökningsprogrammet kan ignorera händelsen.

Felsökningsprogrammet kan också ange hanteringsstatus för varje undantag och händelse. Felsökningsprogrammet kan behandla händelsen som ett hanterat undantag eller ett ohanterat undantag. (Naturligtvis kräver händelser som inte är fel inte någon hantering.)

Du kan styra brytstatus och hanteringsläge genom att göra något av följande:

  • Använd kommandot SXE, SXD, SXN eller SXI i felsökningskommandofönstret.

  • (CDB och NTSD) Använd alternativet -x, -xe, -xd, -xn eller -xikommandoraden.

  • (CDB, NTSD och KD) Använd nyckelordet sxe eller sxd i filenTools.ini .

  • (Endast WinDbg) Välj Händelsefilterpå felsökningsmenyn för att öppna dialogrutan Händelsefilter och välj sedan de alternativ som du vill använda.

Kommandot SX\*, kommandoradsalternativet -x\* och sx\* Tools.ini nyckelord anger vanligtvis brytstatus för den angivna händelsen. Du kan lägga till alternativet -h för att göra så att hanteringsstatusen anges i stället.

Det finns fyra särskilda händelsekoder (cc, hc, bpec och ssec) som alltid anger hanteringsstatus i stället för brytstatus.

Du kan visa det senaste undantaget eller händelsen med hjälp av kommandot .lastevent (Visa senaste händelse).

Kontrollera brytstatus

När du anger brytstatus för ett undantag eller en händelse kan du använda följande alternativ.

Befallning Statusnamn Beskrivning

SXE eller -xe

Paus

(Aktiverad)

När det här undantaget inträffar bryter målet omedelbart in i felsökningsprogrammet. Den här inbrytningen inträffar innan andra felhanterare aktiveras. Den här metoden kallas för hantering av första chansen.

SXD eller -xd

Andra chansens paus

(Inaktiverad)

Felsökningsprogrammet bryter inte in för den här typen av undantag från första chansen (även om ett meddelande visas). Om andra felhanterare inte kan hantera det här undantaget, avbryts körningen och programmet hoppar in i felsökningsläget. Den här metoden kallas för hantering av andra chansen.

SXN eller -xn

Resultat

(Meddela)

När det här undantaget inträffar bryter inte målprogrammet alls in i felsökningsprogrammet. Ett meddelande visas dock som informerar användaren om det här undantaget.

SXI eller -xi

Ignorera

När det här undantaget inträffar bryts inte målprogrammet in i felsökningsprogrammet och inget meddelande visas.

Om ett undantag inte förväntas av en SX*-inställning bryter målprogrammet in i felsökningsprogrammet vid den andra chansen. Standardstatusen för händelser visas i följande avsnitt "Händelsedefinitioner och standardvärden" i det här avsnittet.

Om du vill ange brytstatus med det grafiska gränssnittet WinDbg väljer händelsefilterpå felsökningsmenyn den händelse som du vill använda i listan i dialogrutan Händelsefilter och väljer sedan Aktiverad, Inaktiverad, Utdata eller Ignorera.

Kontrollera hanteringsstatus

Alla händelser anses vara ohanterade, såvida du inte använder kommandot gh (Go with Exception Handled).

Alla undantag betraktas som ohanterade, såvida du inte använder kommandot sx\* tillsammans med alternativet -h .

Dessutom kan SX*-alternativ konfigurera hanteringsstatus för ogiltiga handtag, STATUS_BREAKPOINT brytinstruktioner och enstegsundantag. (Den här konfigurationen är separat från deras brytkonfiguration.) När du konfigurerar deras avbrottsstatus får dessa händelser namnet ch, bpe respektive sse. När du konfigurerar deras hanteringsstatus får dessa händelser namnet hc, bpec respektive ssec. (En fullständig lista över händelser finns i avsnittet "Händelsedefinitioner och standardinställningar".)

Du kan konfigurera hanteringsstatusen för CTRL+C-händelsen (cc), men inte dess brytstatus. Om ett program tar emot en CTRL+C-händelse bryter programmet alltid in i felsökningsprogrammet.

När du använder SX*-kommandot på cc-, hc-, bpec- och ssec-händelser , eller när du använder SX*-kommandot tillsammans med alternativet -h i ett undantag, sker följande åtgärder.

Befallning Statusnamn Beskrivning

SXE

Hanteras

Händelsen betraktas som hanterad när exekveringen återupptas.

SXD,SXN,SXI

Hanteras inte

Händelsen anses som ohanterad när exekveringen återupptas.

Om du vill ange hanteringsstatus med det grafiska gränssnittet WinDbg väljer du Händelsefilter på menyn Felsök , väljer den händelse som du vill använda i listan i dialogrutan Händelsefilter och väljer sedan Hanterat eller Inte hanterat.

Automatiska kommandon

Med felsökningsprogrammet kan du också ange kommandon som körs automatiskt om händelsen eller undantaget orsakar en inbrytning i felsökningsprogrammet. Du kan ange en kommandosträng för första chans-avbrottet och en kommandosträng för andra chans-avbrottet. Du kan ange dessa strängar med SX\* kommandot eller Debugg | Händelsefilter. Varje kommandosträng kan innehålla flera kommandon som är avgränsade med semikolon.

Dessa kommandon körs oavsett brytstatus. Om brytstatusen är "Ignorera" körs kommandot fortfarande. Om brytstatusen är "Second-chance break" körs kommandot first-chance när undantaget först inträffar, innan andra undantagshanterare är inblandade. Kommandosträngen kan avslutas med ett körningskommando som g (Go), gh (Go med hanterat undantag), eller gn (Go med ohanterat undantag).

Händelsedefinitioner och standardvärden

Du kan ändra brytstatus eller hanteringsstatus för följande undantag. Deras standardläge för rast anges.

Följande undantags standardhanteringsstatus är alltid "Inte hanterad". Var försiktig med att ändra den här statusen. Om du ändrar den här statusen till "Hanterad" betraktas alla undantag från första chansen och andra chansen av den här typen som hanterade, och den här konfigurationen kringgår alla rutiner för undantagshantering.

Händelsekod Innebörd Standardstatus för avbrott

asrt

Assertionsfel

Paus

av

Åtkomstöverträdelse

Paus

dm

Feljusterade data

Paus

Dz

Heltalsdivision med noll som nämnare

Paus

c000008e

Flyttalsdivision med noll

Paus

Eh

C++ EH-undantag

Andra chansens paus

Gp

Brott mot skyddssidan

Paus

ii

Otillåten instruktion

Andra chansens paus

iov

Heltalsöverflöd

Paus

ip

I/O-fel på sidan

Paus

Isc

Ogiltigt systemanrop

Paus

lsq

Ogiltig låssekvens

Paus

sbo

Stackbuffertöverskridande

Paus

sov

Stacköverflöd

Paus

wkd

Väck debuggare

Paus

aph

Programlåsning

Det här undantaget utlöses om Windows-operativsystemet drar slutsatsen att en process har slutat svara (det vill säga är låst).

Paus

3c

Barnapplikationsavslutning

Andra chansens paus

chhc

Ogiltigt handtag

Paus

Nummer

Valfritt numrerat undantag

Andra chansens paus

Notera Du kan åsidosätta brytstatusen för asrt för en specifik adress med hjälp av kommandot ah (Satshantering) Händelsekoderna ch och hc refererar till samma undantag. När du styr dess brytstatus använder du sx* ch. När du styr dess hanteringsstatus använder du sx* hc.

Du kan ändra brytstatus eller hanteringsstatus för följande undantag. Deras standardbrytstatus är angiven.

Följande undantags standardhanteringsstatus är alltid "Hanterad". Eftersom dessa undantag används för att kommunicera med felsökningsprogrammet bör du vanligtvis inte ändra deras status till "Inte hanterad". Den här statusen gör att andra undantagshanterare fångar undantagen om felsökaren ignorerar dem.

Ett program kan använda DBG_COMMAND_EXCEPTION (dbce) för att kommunicera med felsökningsprogrammet. Det här undantaget liknar en brytpunkt, men du kan använda SX*-kommandot för att reagera på ett specifikt sätt när det här undantaget inträffar.

Händelsekod Innebörd Standardstatus för avbrott

dbce

Undantag för särskilt felsökningskommando

Ignorera

vcpp

Speciellt Visual C++-undantag

Ignorera

wos

WOW64-undantag i ett steg

Paus

wob

WOW64-brytpunktsundantag-

Paus

Sse
ssec

Undantag i ett steg

Paus

bpe
bpec

Brytpunktsundantag

Paus

cce
kubikcentimeter

CTRL+C eller CTRL+BREAK

Det här undantaget utlöses om målet är ett konsolprogram och CTRL+C eller CTRL+BREAK skickas till det.

Paus

Not De sista tre undantagen i föregående tabell har två olika händelsekoder. När du styr deras avbrottsstatus använder du sse, bpe och cce. När du styr deras hanteringsstatus använder du ssec, bpec och cc.

Följande undantag är användbara när du felsöker hanterad kod.

Händelsekod Innebörd Standardstatus

Clr

Common Language Runtime-undantag

Andra chansens paus

Hanteras inte

clrn

Undantag för Common Language Runtime-meddelanden

Andra chansens paus

Hanterad

Du kan ändra avbrottsstatusen för följande händelser. Eftersom dessa händelser inte är undantag är deras hanteringsstatus irrelevant.

Händelsekod Innebörd Standardstatus för avbrott

ser

Systemfel

Ignorera

cpr[:Process]

Skapa process

Att ange avbrottsstatus för den här händelsen gäller endast felsökning i användarläge. Den här händelsen inträffar inte i kernelläge.

Du kan bara styra den här händelsen om du har aktiverat felsökning av underordnade processer i CDB eller WinDbg, antingen viakommandoradsalternativet -o eller via kommandot .childdbg (Debug Child Processes).

Processnamnet kan innehålla ett valfritt filnamnstillägg och en asterisk () eller ett frågetecken (?) som jokertecken. Felsökaren kommer bara ihåg den senaste cpr-inställningen . Separata inställningar för separata processer stöds inte. Inkludera ett kolon eller ett blanksteg mellan cpr och Process.

Om Process utelämnas gäller inställningen för alla skapade underprocesser.

Ignorera

epr[:Process]

Processen avslutas

Att ange avbrottsstatus för den här händelsen gäller endast felsökning i användarläge. Den här händelsen inträffar inte i kernelläge.

Du kan bara styra den här händelsen om du har aktiverat felsökning av underordnade processer i CDB eller WinDbg, antingen viakommandoradsalternativet -o eller via kommandot .childdbg (Debug Child Processes).

Processnamnet kan innehålla ett valfritt filnamnstillägg och en asterisk () eller ett frågetecken (?) som jokertecken. Felsökningsprogrammet kommer bara ihåg den senaste epr-inställningen . Separata inställningar för separata processer stöds inte. Inkludera ett kolon eller ett blanksteg mellan epr och Process.

Om Processen utelämnas gäller inställningen för alla underordnade processer som avslutas.

Ignorera

ct

Skapa tråd

Ignorera

Et

Trådavslut

Ignorera

ld[:Module]

Läs in modulen

Om du anger Modul inträffar pausen när modulen med det här namnet läses in. Modulen kan ange namnet eller adressen för modulen. Om namnet används kan Module innehålla en mängd olika jokertecken och specificerare. (Mer information om syntaxen finns i Strängsyntax för jokertecken.)

Felsökaren kommer bara ihåg den senaste ld-inställningen . Separata inställningar för separata moduler stöds inte. Inkludera ett kolon eller ett blanksteg mellan ld och Modul.

Om Modul utelämnas utlöses händelsen när en modul läses in.

Utgång

ud[:Module]

Ta bort modul

Om du anger Modul inträffar avbrottet när modulen med det här namnet, eller vid den här basadressen, avlastas. Modulen kan ange namnet eller adressen för modulen. Om namnet används kan Module vara ett exakt namn eller innehålla jokertecken. Om Modulen är ett exakt namn matchas den omedelbart till en basadress med hjälp av den aktuella listan över felsökningsmoduler och lagras som en adress. Om Modulen innehåller jokertecken sparas mönstersträngen för senare matchning när avladdningshändelser inträffar.

Det är sällsynt att felsökaren saknar namninformation för avladdningshändelser och endast matchar basadressen. Om Modulen innehåller jokertecken kan felsökaren därför inte utföra en namnmatchning i det här avlastningsfallet och pauser när någon modul tas bort.

Felsökningsprogrammet kommer bara ihåg den senaste ud-inställningen . Separata inställningar för separata moduler stöds inte. Inkludera ett kolon eller ett blanksteg mellan ud och Modul.

Om Modul utelämnas utlöses händelsen när en modul läses in.

Utgång

out[:Output]

Målprogramutdata

Om du anger Utdata sker brytningen endast när utdata som matchar det angivna mönstret tas emot. Utdata kan innehålla en mängd wildcard-tecken och specifierare. (Mer information om syntaxen finns i Strängsyntax för jokertecken.) Utdata får dock inte innehålla kolon eller mellanslag. Matchningen är inte skiftlägeskänslig. Inkludera ett kolon eller blanksteg mellan ut och utdata.

Ignorera

ibp

Inledande brytpunkt

(Den här händelsen inträffar i början av felsökningssessionen och när du har startat om måldatorn.)

I användarläge: Paus. Du kan ändra den här statusen till "Ignorera" med hjälp av kommandoradsalternativet-g.

I kernelläge: Bortse från. Du kan ändra den här statusen till "Aktiverad" med en mängd olika metoder. För mer information om hur du ändrar den här statusen, se "Krascha och starta om måldatorn".

iml

Inledande modulinläsning

(Endast kernel-läge)

Ignorera Du kan ändra den här statusen till "Break" med en mängd olika metoder. För mer information om hur du ändrar den här statusen, se Crashing and Rebooting the Target Computer.