Sdílet prostřednictvím


Řízení výjimek a událostí

Výjimky v uživatelském režimu a aplikacích v režimu jádra můžete zachytit a zpracovat různými metodami. Aktivní ladicí program, ladicí program postmortem nebo vnitřní rutina zpracování chyb jsou běžnými způsoby zpracování výjimek.

Další informace o prioritě pořadí těchto různých obsluh výjimek viz Povolení ladění postmortem.

Když operační systém Microsoft Windows umožní ladicímu nástroji zpracovat výjimku, aplikace, která vygenerovala výjimku , vstoupí do ladicího nástroje. To znamená, že aplikace se zastaví a ladicí program se zapne. Ladicí program pak může zpracovat výjimku nějakým způsobem nebo analyzovat situaci. Ladicí program pak může proces ukončit nebo ho nechat běžet.

Pokud ladicí program ignoruje výjimku a umožní aplikaci pokračovat ve spuštění, operační systém hledá další obslužné rutiny výjimek, jako by nebyl k dispozici žádný ladicí program. Pokud je výjimka zpracována, aplikace bude dál spuštěná. Pokud však výjimka zůstane neošetřená, ladicí program má pak druhou příležitost k řešení situace.

Použití Ladicího Programu k Analýze Výjimky

Když se výjimka nebo událost zastaví v ladicím programu, můžete pomocí ladicího programu prozkoumat kód, který se právě spouští, a paměť, kterou aplikace používá. Změnou určitých množství nebo přechodem na jiný bod v aplikaci můžete odstranit příčinu výjimky.

Ve spuštění můžete pokračovat vydáním příkazu gh (Go with Exception Handled) nebo gn (Go with Exception Not Handled).

Pokud v druhé příležitosti, kterou ladicí program má ke zpracování výjimky, vydáte příkaz gn, aplikace skončí.

Výjimky Kernel-Mode

Výjimky, ke kterým dochází v kódu v režimu jádra, jsou vážnější než výjimky uživatelského režimu. Pokud nejsou výjimky v režimu jádra zpracovány, dojde k vystavení kontroly chyb a systém se zastaví.

Stejně jako u výjimek v uživatelském režimu, pokud je k systému připojen ladicí program v režimu jádra, je ladicí program upozorněn předtím, než se zobrazí obrazovka kontroly chyb (známá také jako modrá obrazovka). Pokud není připojený žádný ladicí program, zobrazí se obrazovka kontroly chyb. V tomto případě může operační systém vytvořit soubor s výpisem stavu systému.

Správa výjimek a událostí z ladicího programu

Ladicí program můžete nakonfigurovat tak, aby reagoval na zadané výjimky a události určitým způsobem.

Ladicí program může nastavit stav přerušení pro každou výjimku nebo událost:

  • Událost může způsobit přerušení ladicího programu, jakmile dojde ("první šance").

  • Událost může proběhnout poté, co ostatní obslužné rutiny chyb dostanou příležitost reagovat („druhá šance“).

  • Událost může také odeslat ladicímu programu zprávu a pokračovat v provádění.

  • Ladicí program může událost ignorovat.

Ladicí program může také nastavit stav zpracování pro každou výjimku a událost. Ladicí program může zacházet s událostí jako zpracovávaná výjimka nebo neošetřená výjimka. (Samozřejmě, události, které nejsou ve skutečnosti chyby nevyžadují žádné zpracování.)

Můžete řídit stav přerušení a stav zpracování jedním z následujících způsobů:

  • Použijte příkaz SXE, SXD, SXNnebo SXI v příkazovém okně ladicího programu .

  • (CDB a NTSD) Použijte -x, -xe, -xd, -xnnebo -xi na příkazovém řádku .

  • (CDB, NTSD a KD) V souboru Tools.ini použijte klíčové slovo sxe nebo sxd.

  • (jenom WinDbg) V nabídce Ladění vyberte Filtry událostí, což otevře dialogové okno Filtry událostí, a pak zvolte požadované možnosti.

Příkaz SX\*, možnost -x\* příkazového řádku a sx\* Tools.ini klíčové slovo obvykle nastaví stav přerušení zadané události. Můžete přidat možnost -h, aby se místo toho nastavil stav zpracování.

Existují čtyři speciální kódy událostí (cc, hc, bpeca ssec), které vždy určují stav zpracování místo stavu přerušení.

Nejnovější výjimku nebo událost můžete zobrazit pomocí příkazu .lastevent (Zobrazit poslední událost).

řízení stavu pauzy

Když nastavíte stav přerušení výjimky nebo události, můžete použít následující možnosti.

Příkaz Název stavu Popis

SXE nebo -xe

přerušení

(Povoleno)

Když dojde k této výjimce, cíl okamžitě vstoupí do ladicího programu. K přerušení dochází před aktivací jakýchkoli jiných obslužných rutin chyb. Tato metoda se nazývá zpracování první šance .

SXD nebo -xd

Přestávka druhé šance

(Zakázáno)

Ladicí program se pro tento druh výjimky s první šancí nepřeruší (i když se zobrazí zpráva). Pokud jiné obslužné rutiny chyb nemůžou tuto výjimku vyřešit, spuštění se zastaví a cíl přejde do ladicího prostředí. Tato metoda se nazývá zpracování druhé šance.

SXN nebo -xn

Výstup

(Oznámit)

Pokud k této výjimce dojde, cílová aplikace se vůbec nespustí v ladicím programu. Zobrazí se však zpráva, která uživatele informuje o této výjimce.

SXI nebo -xi

Ignorovat

Pokud dojde k této výjimce, cílová aplikace se nedostane do ladicího programu a nezobrazí se žádná zpráva.

Pokud nastavení SX* neočekává výjimku, cílová aplikace při druhé příležitosti přejde do ladicího programu. Výchozí stav událostí je uveden v následující části Definice událostí a výchozí hodnoty tohoto tématu.

Chcete-li nastavit stav přerušení pomocí grafického rozhraní WinDbg, v nabídce Ladění vyberte Filtry událostí, poté zvolte požadovanou událost v seznamu v dialogovém okně Filtry událostí a nakonec vyberte možnost Povoleno, Zakázáno, Výstupnínebo Ignorovat.

Ovládání stavu zpracování

Všechny události jsou považovány za neošetřené, pokud nepoužijete příkaz gh (Go with Exception Handled).

Všechny výjimky jsou považovány za neošetřené, pokud nepoužíváte příkaz sx\* společně s možností -h.

Kromě toho možnosti SX* mohou nakonfigurovat stav zacházení pro neplatné popisovače, STATUS_BREAKPOINT přerušovací instrukce a výjimky při jednom kroku. (Tato konfigurace je oddělená od jejich konfigurace přerušení.) Při konfiguraci jejich stavu přerušení se tyto události nazývají ch, bpea sse. Při konfiguraci jejich stavu zpracování se tyto události nazývají hc, bpeca ssec. (Úplný seznam událostí najdete v následující části Definice událostí a výchozí hodnoty.)

Můžete nakonfigurovat stav zpracování pro událost CTRL+C (cc), ale ne její stav přerušení. Pokud aplikace obdrží událost CTRL+C, aplikace vždy přejde do ladicího programu.

Pokud použijete příkaz SX* na cc, hc, bpeca ssec události, nebo když použijete příkaz SX* společně s možností -h u výjimky, dojde k následujícím akcím.

Příkaz Název stavu Popis

SXE

vyřízeno

Událost se považuje za zpracovanou, když se vykonávání obnoví.

SXD, SXN, SXI

nezpracováno

Událost se při obnovení provádění považuje za nezpracovanou.

Pokud chcete nastavit stav zpracování pomocí grafického rozhraní WinDbg, vyberte Filtry událostí v nabídce Ladění, vyberte v seznamu požadovanou událost v dialogovém okně Filtry událostí a pak vyberte Zpracovávané nebo Nezpracované.

automatické příkazy

Ladicí program také umožňuje nastavit příkazy, které se automaticky spustí, pokud událost nebo výjimka způsobí přerušení ladicího programu. Můžete nastavit řetězec příkazu pro první náhodnou přestávku a řetězec příkazu pro druhé náhodné přerušení. Tyto řetězce můžete nastavit pomocí příkazu SX\* nebo Debug | Příkaz Filtry událostí. Každý řetězec příkazu může obsahovat více příkazů oddělených středníky.

Tyto příkazy se spouští bez ohledu na stav přerušení. To znamená, že pokud je stav přerušení "Ignorovat", příkaz se stále spustí. Pokud je stav přerušení "Druhé šance přerušení", při prvním výskytu výjimky se spustí příkaz první šance ještě před tím, než se zapojí jakékoli jiné obslužné rutiny výjimek. Řetězec příkazu může končit spouštěcím příkazem, například g (Go), gh (Go with Exception Handled)nebo gn (Go with Exception Not Handled).

Definice událostí a výchozí hodnoty

Stav přerušení nebo zpracování následujících výjimek můžete změnit. Je uveden výchozí stav přerušení.

Výchozí stav zpracování následujících výjimek je vždy "Nezpracováno". Buďte opatrní při změně tohoto stavu. Pokud změníte tento stav na "Zpracováno", všechny výjimky první šance a druhé šance tohoto typu se považují za zpracovávané a tato konfigurace obchází všechny rutiny zpracování výjimek.

Kód události Význam Výchozí stav přerušení

Selhání tvrzení

Přestávka

av

Porušení přístupu

Přestávka

dm

Nesprávně zarovnaná data

Přestávka

dz

Celočíselné dělení nulou

Přestávka

c000008e

Dělení s plovoucí čárkou nulou

Přestávka

že?

Výjimka C++ EH

Druhá náhodná přestávka

gp

Porušení ochrany stránky

Přestávka

ii

Neplatná instrukce

Druhá náhodná přestávka

iov

Přetečení celého čísla

Přestávka

ip

Chyba vstupně-výstupních operací na stránce

Přestávka

isc

Neplatné systémové volání

Přestávka

lsq

Neplatná posloupnost zámků

Přestávka

sbo

Přetečení vyrovnávací paměti zásobníku

Přestávka

Přetečení zásobníku

Přestávka

wkd

Probudit ladicí program

Přestávka

ph

Zamrznutí aplikace

Tato výjimka se aktivuje, pokud operační systém Windows dospěl k závěru, že proces přestal reagovat (to znamená, že je zablokovaný).

Přestávka

3c

Ukončení podřízené aplikace

Druhá náhodná přestávka

ch
hc

Neplatný popisovač

Přestávka

číslo

Libovolná očíslovaná výjimka

Druhá náhodná přestávka

Poznámka Můžete přepsat stav asrt přerušení konkrétní adresy pomocí příkazu ah (Kontrolní zpracování). Kódy událostí ch a hc se vztahují ke stejné výjimce. Při kontrole stavu přerušení použijte sx* ch. Při řízení jeho stavu zpracování použijte sx* hc.

Stav přerušení nebo zpracování následujících výjimek můžete změnit. Je uveden výchozí stav přerušení.

Výchozí stav zpracování následujících výjimek je vždy "Zpracováno". Vzhledem k tomu, že se tyto výjimky používají ke komunikaci s ladicím programem, neměli byste obvykle měnit jejich stav na Nezpracováno. Tento stav způsobí, že ostatní zpracovatelé výjimek zachytí výjimky, pokud je ladicí program ignoruje.

Aplikace může ke komunikaci s ladicím programem použít DBG_COMMAND_EXCEPTION (dbce). Tato výjimka se podobá zarážce, ale můžete použít příkaz SX* k reakci určitým způsobem, když dojde k této výjimce.

Kód události Význam Výchozí stav přerušení

dbce

Výjimka zvláštního ladicího příkazu

Ignorovat

vcpp

Speciální výjimka jazyka Visual C++

Ignorovat

Výjimka s jedním krokem WOW64

Přestávka

wob

Výjimka bodu přerušení WOW64

Přestávka

Sse
ssec

Výjimka s jedním krokem

Přestávka

bpe
bpec

Výjimka zarážky

Přestávka

cce
cc

CTRL+C nebo CTRL+BREAK

Tato výjimka se aktivuje, pokud je cílem konzolová aplikace a předá se mu ctrl+C nebo CTRL+BREAK.

Přestávka

Poznámka Poslední tři výjimky v předchozí tabulce mají dva různé kódy událostí. Při řízení jejich stavu přerušení použijte sse, bpea cce. Při řízení jejich stavu zpracování použijte ssec, bpeca cc.

Následující výjimky jsou užitečné při ladění spravovaného kódu.

Kód události Význam Výchozí stav

clr

Výjimka modulu CLR (Common Language Runtime)

Druhá náhodná přestávka

Nezpracováno

clrn

Výjimka oznámení modulu CLR (Common Language Runtime)

Druhá náhodná přestávka

Vyřízeno

Můžete změnit stav přerušení následujících událostí. Vzhledem k tomu, že tyto události nejsou výjimky, jejich stav zpracování není relevantní.

Kód události Význam Výchozí stav přerušení

Systémová chyba

Ignorovat

cpr[:Proces]

Vytvoření procesu

Nastavení stavu přerušení této události se vztahuje pouze na ladění v uživatelském režimu. K této události nedojde v režimu jádra.

Tuto událost můžete řídit pouze v případě, že jste aktivovali ladění podřízených procesů v CDB nebo WinDbg, a to buď prostřednictvím parametru -opříkazového řádku nebo prostřednictvím příkazu .childdbg (ladění podřízených procesů) příkazu.

Název procesu může obsahovat volitelnou příponu názvu souboru a hvězdičku () nebo otazník (?) jako zástupné znaky. Ladicí program si pamatuje pouze nejnovější nastavení cpr. Samostatná nastavení pro samostatné procesy nejsou podporována. Zahrňte dvojtečku nebo mezeru mezi cpr a proces.

Pokud proces vynecháte, nastavení se vztahuje na vytvoření jakéhokoliv podřízeného procesu.

Ignorovat

epr[:Proces]

Ukončení procesu

Nastavení stavu přerušení této události se vztahuje pouze na ladění v uživatelském režimu. K této události nedojde v režimu jádra.

Tuto událost můžete řídit pouze v případě, že jste aktivovali ladění podřízených procesů v CDB nebo WinDbg, a to buď prostřednictvím parametru -opříkazového řádku nebo prostřednictvím příkazu .childdbg (ladění podřízených procesů) příkazu.

Název procesu může obsahovat volitelnou příponu názvu souboru a hvězdičku () nebo otazník (?) jako zástupné znaky. Ladicí program si pamatuje pouze nejnovější nastavení epr. Samostatná nastavení pro samostatné procesy nejsou podporována. Přidejte dvojtečku nebo mezeru mezi epr a Proces.

Pokud proces vynecháte, nastavení se vztahuje na ukončení podřízeného procesu.

Ignorovat

ct

Vytvoření vlákna

Ignorovat

et

Ukončení vlákna

Ignorovat

[:modul]

Načíst modul

Pokud zadáte modul, dojde k přerušení při načtení modulu s tímto názvem. modul může zadat název nebo adresu modulu. Pokud se název použije, modul může obsahovat různé zástupné znaky a specifikátory. (Další informace o syntaxi viz Syntaxe řetězce se zástupnými znaky.)

Ladicí program si pamatuje pouze nejnovější nastavení ld. Samostatná nastavení pro samostatné moduly nejsou podporována. Zahrňte dvojtečku nebo mezeru mezi a Modul.

Pokud modul vynecháte, událost se aktivuje při načtení libovolného modulu.

Výstup

ud[:modul]

Uvolnění modulu

Pokud zadáte modul, dojde k přerušení ve chvíli, kdy je modul s tímto názvem, případně na této základnové adrese, uvolněn. modul může zadat název nebo adresu modulu. Pokud se název použije, modul může být přesný název nebo může obsahovat zástupné znaky. Pokud je Modul přesným názvem, okamžitě se přeloží na základní adresu pomocí aktuálního seznamu modulů debuggeru a uloží se jako adresa. Pokud modul obsahuje zástupné znaky, řetězec vzoru je uchován pro pozdější porovnávání, když dojde k uvolňovacím událostem.

Ladicí program zřídka nemá informace o názvu pro události uvolnění a shoduje se pouze podle základní adresy. Proto pokud modul obsahuje zástupné znaky, ladicí program nemůže provést shodu názvů v tomto konkrétním případě uvolnění a přeruší se při uvolnění jakéhokoli modulu.

Ladicí program si pamatuje pouze nejnovější nastavení ud. Samostatná nastavení pro samostatné moduly nejsou podporována. Zahrňte dvojtečku nebo mezeru mezi ud a modulu.

Pokud modul vynecháte, událost se aktivuje při načtení libovolného modulu.

Výstup

[:Výstup]

Výstup cílové aplikace

Pokud zadáte výstup, přerušení nastane pouze v případě, že se přijímá výstup, který vyhovuje zadanému vzoru. Výstup může obsahovat různé zástupné znaky a specifikátory. (Další informace o syntaxi najdete v tématu Syntaxe se zástupnými znaky řetězce.) Výstup však nesmí obsahovat dvojtečku nebo mezery. Shoda není citlivá na velikost písmen. Zahrňte dvojtečku nebo mezeru mezi out a Output.

Ignorovat

ibp

Počáteční bod přerušení

(Tato událost nastane na začátku ladicí relace a po restartování cílového počítače.)

V uživatelském režimu: Přerušit. Tento stav můžete změnit na Ignorovat pomocí možnosti -gpříkazového řádku.

V režimu jádra: ignorovat. Tento stav můžete změnit na Povoleno různými metodami. Další informace o tom, jak tento stav změnit, naleznete v tématu Selhání a restartování cílového počítače.

iml

Počáteční načtení modulu

(Pouze režim jádra)

Ignorujte. Tento stav můžete změnit na Break různými metodami. Další informace o tom, jak tento stav změnit, naleznete v tématu Selhání a restartování cílového počítače.