Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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 |
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 |
Výjimka s jedním krokem |
Přestávka |
bpe |
Výjimka zarážky |
Přestávka |
cce |
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. |