Sdílet prostřednictvím


Povolení ladění postmortem

Zpracování výjimek uživatelského režimu

Výjimky a zarážky

Nejběžnější chyby aplikace se nazývají výjimky. Patří mezi ně porušení přístupu, chyby dělení po nule, číselné přetečení, výjimky CLR a mnoho dalších typů chyb. Aplikace můžou také způsobit přerušení přerušovacích bodů. K těmto událostem dochází v případě, že systém Windows nemůže spustit aplikaci (například v případě, že nezbytný modul nelze načíst) nebo když dojde k zarážce. Zarážky lze do kódu vložit ladicím programem nebo spustit pomocí funkce, jako je DebugBreak.

Priorita obslužných rutin výjimek

Na základě hodnot konfigurace a toho, které ladicí programy jsou aktivní, systém Windows zpracovává chyby uživatelského režimu různými způsoby. Následující posloupnost ukazuje prioritu použitou pro zpracování chyb v uživatelském režimu:

  1. Pokud je k chybujícímu procesu aktuálně připojen ladicí program běžící v uživatelském režimu, všechny chyby způsobí, že se cíl zastaví v tomto ladicím programu.

    Pokud je ladicí program v uživatelském režimu připojený, nebudou použity žádné jiné metody zpracování chyb – i když se použije příkaz gn (Go With Exception Not Handled).

  2. Pokud není připojený žádný ladicí program v uživatelském režimu a spuštěný kód má vlastní rutiny zpracování výjimek (například zkuste – s výjimkou), pokusí se tato rutina zpracování výjimek vyřešit chybu.

  3. Pokud není připojený žádný ladicí program v uživatelském režimu a Systém Windows má otevřené připojení ladění jádra a chyba je přerušení zarážky, Windows se pokusí kontaktovat ladicí program jádra.

    Během procesu spouštění Windows musí být otevřena spojení ladění jádra. Pokud chcete zabránit přerušení uživatelského režimu v přerušení do ladicího programu jádra, můžete použít nástroj KDbgCtrl s parametrem -du. Podrobnosti o tom, jak nakonfigurovat připojení ladění jádra a jak používat KDbgCtrl, najdete v tématu Nastavení ladění.

    V ladicím programu jádra můžete použít gh (Go With Exception Handled) k ignorování chyby a pokračování ve spuštění cíle. Pomocí příkazu gn (Go With Exception Not Handled) můžete obejít ladicí program jádra a přejít ke kroku 4.

  4. Pokud podmínky v krocích 1, 2 a 3 neplatí, systém Windows aktivuje nástroj pro ladění nakonfigurovaný v hodnotách registru AeDebug. Jako nástroj, který se má v této situaci použít, je možné předem vybrat libovolný program. Zvolený program se označuje jako ladicí program postmortem.

  5. Pokud se podmínky v krocích 1, 2 a 3 nepoužijí a není zaregistrovaný ladicí program postmortem, zobrazí funkce Zasílání zpráv o chybách systému Windows (WER) zprávu a poskytne řešení, pokud jsou k dispozici. WER také zapíše soubor výpisu paměti, pokud jsou v registru nastaveny příslušné hodnoty. Další informace najdete v tématu Použití WER a Shromažďování User-Mode výpisů.

DebugBreak – funkce

Pokud byl nainstalován postmortem ladicí program, můžete úmyslně vstoupit do ladicího programu z aplikace v uživatelském režimu voláním funkce DebugBreak.

Určení ladicího programu Postmortem

Tato část popisuje, jak nakonfigurovat nástroje, jako je WinDbg, jako ladicí program postmortem. Po nakonfigurování se ladicí program postmortem automaticky spustí při každém chybovém ukončení aplikace.

Klíče registru ladicího programu Post Mortem

Zasílání zpráv o chybách systému Windows (WER) vytvoří proces ladicího programu postmortem pomocí hodnot nastavených v klíči registru AeDebug.

HKLM\Software\Microsoft\Windows NT\CurrentVersion\AeDebug

Existují dvě primární hodnoty registru, které zajímá, Ladicí program a Auto. Hodnota registru ladicího programu určuje příkazový řádek pro ladicí program postmortem. Hodnota registru Auto určuje, zda je ladicí program postmortem automaticky spuštěn, nebo pokud se nejprve zobrazí potvrzovací zpráva.

Ladicí program (REG_SZ)

Tato hodnota REG_SZ určuje ladicí program, který bude zpracovávat ladění po skončení.

Úplná cesta k ladicímu nástroji musí být uvedena, pokud nástroj není umístěn v adresáři, který je ve výchozí cestě.

Příkazový řádek se generuje z řetězce debuggeru prostřednictvím volání ve stylu printf, které obsahuje 3 parametry. I když je objednávka pevná, není nutné používat žádné nebo všechny dostupné parametry.

DWORD (%ld) – ID cílového procesu.

DWORD (%ld) – Zpracování událostí duplikované do procesu ladicího programu postmortem. Pokud ladicí program postmortem signalizuje událost, WER bude pokračovat v cílovém procesu bez čekání na ukončení ladicího programu postmortem. Událost by měla být signalizována pouze v případě, že byl problém vyřešen. Pokud se ladicí program postmortem ukončí, aniž by signalizoval událost, WER nadále sbírá informace o zkoumaných procesech.

void* (%p) – adresa struktury JIT_DEBUG_INFO přidělené v adresním prostoru cílového procesu. Struktura obsahuje další informace o výjimce a kontext.

Auto (REG_SZ) Tato REG_SZ hodnota je vždy 0 nebo 1.

Pokud je Auto nastaveno na 0, zobrazí se okno s potvrzovací zprávou před zahájením procesu ladění po selhání.

Pokud je Auto nastaveno na 1, ladicí program postmortem je okamžitě vytvořen.

Při ruční úpravě registru postupujte velmi opatrně, protože nesprávné změny registru nemusí umožňovat spuštění systému Windows.

Příklad použití příkazového řádku

Mnoho ladících programů postmortem používá příkazový řádek, který obsahuje přepínače -p a -e, které znamenají, že parametry jsou PID a událost (v uvedeném pořadí). Například instalace WinDbg prostřednictvím windbg.exe -I vytvoří následující hodnoty:

Debugger = "<Path>\WinDbg -p %ld -e %ld -g"
Auto = 1

Způsob použití parametrů %ld %ld %p WER je flexibilní. Například. není nutné zadávat žádné přepínače kolem parametrů WER ani mezi těmito parametry. Například při instalaci Windows Sysinternals ProcDump pomocí procdump.exe -i se vytvoří následující hodnoty bez použití přepínačů mezi parametry WER %ld %ld %p:

Debugger = "<Path>\procdump.exe" -accepteula -j "c:\Dumps" %ld %ld %p
Auto = 1

32 a 64 bitové ladicí programy

Na 64bitové platformě jsou hodnoty registru Debugger (REG_SZ) a Auto (REG_SZ) definovány jednotlivě pro 64bitové a 32bitové aplikace. Další klíč Windows v systému Windows (WOW) slouží k uložení 32bitových hodnot ladění aplikace po skončení.

HKLM\Software\Wow6432Node\Microsoft\Windows NT\CurrentVersion\AeDebug

Na 64bitové platformě použijte 32bitový ladicí program post-mortem pro 32bitové procesy a 64bitový ladicí program pro 64bitové procesy. Tím se zabrání 64bitovému ladicímu programu zaměřenému na vlákna WOW64 místo 32bitových vláken v 32bitovém procesu.

U mnoha ladicích programů postmortem, včetně ladicích programů postmortem pro Windows, to zahrnuje spuštění instalačního příkazu dvakrát; jednou s verzí x86 a jednou s verzí x64. Pokud chcete například použít WinDbg jako interaktivní ladicí program postmortem, windbg.exe -I spustí se příkaz dvakrát, jednou pro každou verzi.

64bitová instalace:

C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\windbg.exe –I

Tím se aktualizuje klíč registru s těmito hodnotami.

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug
Debugger = "C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\windbg.exe" -p %ld -e %ld –g

32bitová instalace:

C:\Program Files (x86)\Windows Kits\10\Debuggers\x86\windbg.exe –I

Tím se aktualizuje klíč registru s těmito hodnotami.

HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows NT\CurrentVersion\AeDebug
Debugger = "C:\Program Files (x86)\Windows Kits\10\Debuggers\x86\windbg.exe" -p %ld -e %ld –g

Konfigurace ladicíchgerů Post Mortem

Nástroje pro ladění pro Windows

Nástroje ladění pro ladicí programy systému Windows všechny podporují nastavení jako ladicí program postmortem. Příkaz instalovat je určen pro interaktivní ladění procesu.

WinDbg

Pokud chcete nastavit ladicí program postmortem na WinDbg, spusťte windbg -I. (Musí I být velkými písmeny.) Po použití tohoto příkazu se zobrazí zpráva o úspěchu nebo selhání. Pokud chcete pracovat s 32bitovou i 64bitovou aplikací, spusťte příkaz pro ladicí programy 64 i 32.

C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\windbg.exe –I
C:\Program Files (x86)\Windows Kits\10\Debuggers\x86\windbg.exe –I

Tímto způsobem se při spuštění nakonfiguruje windbg -I položka registru AeDebug.

Debugger = "<Path>\WinDbg -p %ld -e %ld -g"
Auto = 1

V příkladech je Path> adresář,< ve kterém se nachází ladicí program.

Parametry -p a -e předávají ID procesu a událost, jak je popsáno dříve.

Parametr -g předá příkaz g (Go) do WinDbg a pokračuje v provádění z aktuální instrukce.

Poznámka Při předávání příkazu g (Go) došlo k významnému problému. Problémem s tímto přístupem je, že výjimky se neopakují vždy, obvykle kvůli přechodné podmínce, která již neexistuje při restartování kódu. Další informace o tomto problému najdete v tématu .jdinfo (použití JIT_DEBUG_INFO).

Chcete-li se tomuto problému vyhnout, použijte .jdinfo nebo .dump /j. Tento přístup umožňuje, aby ladicí program byl v kontextu selhání kódu, který zajímá. Další informace naleznete v tématu Ladění podle potřeby (JIT) dále v tomto tématu.

CDB

Pokud chcete nastavit ladicí program postmortem na CDB, spusťte příkaz cdb -iae (instalace AeDebug) nebo cdb -iaecKeyString (instalace AeDebug pomocí příkazu).

C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\cdb.exe -iae
C:\Program Files (x86)\Windows Kits\10\Debuggers\x86\cdb.exe -iae

Při použití parametru -iaec určuje KeyString řetězec, který se má připojit na konec příkazového řádku, který se používá ke spuštění ladicího programu postmortem. Pokud keyString obsahuje mezery, musí být uzavřen v uvozovkách.

C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\cdb.exe -iaec [KeyString]
C:\Program Files (x86)\Windows Kits\10\Debuggers\x86\cdb.exe -iaec [KeyString]

Tento příkaz nezobrazuje nic, pokud bude úspěšný, a pokud selže, zobrazí se chybová zpráva.

NTSD

Pokud chcete nastavit ladicí program postmortem na NTSD, spusťte příkaz ntsd -iae (instalace AeDebug) nebo ntsd -iaecKeyString (instalace AeDebug pomocí příkazu).

C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\ntsd.exe -iae
C:\Program Files (x86)\Windows Kits\10\Debuggers\x86\ntsd.exe -iae

Při použití parametru -iaec určuje keyString řetězec, který se má připojit na konec příkazového řádku, který se používá ke spuštění ladicího programu postmortem. Pokud keyString obsahuje mezery, musí být uzavřen v uvozovkách.

C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\ntsd.exe -iaec [KeyString]
C:\Program Files (x86)\Windows Kits\10\Debuggers\x86\ntsd.exe -iaec [KeyString]

Tento příkaz nezobrazí nic, pokud bude úspěšný, ale při selhání zobrazí chybu v novém okně konzoly.

Poznámka Vzhledem k tomu, že parametry -p %ld -e %ld -g se vždy zobrazí jako první na příkazovém řádku ladicího programu postmortem, neměli byste použít přepínač -iaec k určení parametru -server, protože -server nebude fungovat, pokud se nezobrazí na příkazovém řádku jako první. Chcete-li nainstalovat ladicí program postmortem, který obsahuje tento parametr, musíte registr upravit ručně.

Ladicí program JIT sady Visual Studio

Pokud je sada Visual Studio nainstalovaná, vsjitdebugger.exe se zaregistruje jako ladicí program post mortem. Ladicí program JIT sady Visual Studio hodlá proces interaktivně ladit.

Debugger = "C:\WINDOWS\system32\vsjitdebugger.exe" -p %ld -e %ld

Pokud je sada Visual Studio aktualizovaná nebo znovu nainstalovaná, tato položka se znovu zapíše a přepíše všechny alternativní sady hodnot.

Okno Sysinternals ProcDump

Nástroj Windows Sysinternals ProcDump lze také použít pro postmortem dump capture. Další informace o používání a stahování nástroje ProcDump naleznete v tématu ProcDump.

Stejně jako příkaz .dump WinDbg dokáže Nástroj ProcDump zachytit výpis stavu systému, který není interaktivně. K zachycení může dojít v jakékoli relaci systému Windows.

Po dokončení zachytávání souboru s výpisem paměti se nástroj ProcDump ukončí, weR hlásí selhání a chybný proces se ukončí.

Slouží procdump -i k instalaci nástroje procdump a -u k odinstalaci nástroje ProcDump pro 32 i 64bitové ladění po mortem.

<Path>\procdump.exe -i

Příkazy instalace a odinstalace vypíšou hodnoty registru, které byly upraveny při úspěchu, a chyby, pokud dojde k selhání.

Možnosti příkazového řádku ProcDump v registru jsou nastavené na:

Debugger = <Path>\ProcDump.exe -accepteula -j "<DumpFolder>" %ld %ld %p

ProcDump používá všechny 3 parametry – PID, Event a JIT_DEBUG_INFO. Další informace o parametru JIT_DEBUG_INFO najdete v části Ladění za běhu (JIT) níže.

Velikost zaznamenaného výpisu paměti má výchozí hodnotu Mini (process/threads/handles/modules/address space) bez sady možností velikosti, MiniPlus (Mini plus MEM_PRIVATE stránek) se sadou -mp nebo Úplnou (veškerá paměť – ekvivalentní hodnotě ".dump /mA") se sadou -ma.

Pro systémy s dostatečným místem na disku se doporučuje úplné zachycení (-ma).

Pomocí -ma s volbou -i určete veškeré zachytávání paměti. Volitelně můžete zadat cestu pro dump soubory.

<Path>\procdump.exe -ma -i c:\Dumps

Pro systémy s omezeným místem na disku je doporučeno použití zachytávání MiniPlus (-mp).

<Path>\procdump.exe -mp -i c:\Dumps

Složka pro uložení souboru s výpisem paměti je volitelná. Výchozí hodnota je aktuální složka. Složka by měla být zabezpečena seznamem ACL, který je stejný nebo lepší než ten, který se používá pro C:\Windows\Temp. Další informace o správě zabezpečení souvisejících se složkami naleznete v tématu Zabezpečení během ladění postmortem.

Chcete-li odinstalovat ProcDump jako postmortem ladicí program a obnovit předchozí nastavení, použijte možnost -u (Uninstall).

<Path>\procdump.exe -u

Další informace o nástroji ProcDump naleznete v tématu ProcDump a Windows SysInternals Administrator's Reference Mark Russinovich a Aaron Margosis publikované společností Microsoft Press.

Ladění "Just In Time" (JIT)

Nastavení kontextu pro chybující aplikaci

Jak je popsáno dříve, je velmi žádoucí nastavit kontext výjimce, která způsobila pád, pomocí parametru JIT_DEBUG_INFO. Další informace o tom najdete v tématu .jdinfo (Použijte JIT_DEBUG_INFO).

nástroje pro ladění pro Windows

Tento příklad ukazuje, jak upravit registr tak, aby spustil počáteční příkaz (-c), který používá příkaz .jdinfo <address> k zobrazení dalších informací o výjimce, a změnit kontext na umístění výjimky (podobně jako .ecxr se používá nastavit kontext na záznam výjimky).

Debugger = "<Path>\windbg.exe -p %ld -e %ld -c ".jdinfo 0x%p"
Auto = 1

Parametr %p je adresa struktury JIT_DEBUG_INFO v adresního prostoru cílového procesu. Parametr %p je předem připojen s hodnotou 0x, aby byl interpretován jako šestnáctkové hodnoty. Další informace viz .jdinfo (Použití JIT_DEBUG_INFO).

Pokud chcete ladit 32bitové a 64bitové aplikace současně, nakonfigurujte 32 i 64bitové klíče registru (popsané výše) a nastavte správné cesty k umístění 64bitové a 32bitové WinDbg.exe.

Vytvoření souboru s výpisem paměti pomocí souboru .dump

Pokud chcete zaznamenat soubor s výpisem paměti při každém selhání, které zahrnuje data JIT_DEBUG_INFO, použijte adresu> .dump /j<.

<Path>\windbg.exe -p %ld -e %ld -c ".dump /j %p /u <DumpPath>\AeDebug.dmp; qd"

Pomocí možnosti /u vygenerujte jedinečný název souboru k umožnění automatického vytvoření více souborů s výpisem. Pro více informací o možnostech viz .dump (Vytvořit soubor s výpisem).

Vytvořený výpis paměti bude obsahovat data JITDEBUG_INFO uložená jako výchozí kontext výjimky. Místo použití .jdinfo k zobrazení informací o výjimce a nastavení kontextu použijte .exr -1 k zobrazení záznamu výjimky a .ecxr k nastavení kontextu. Další informace naleznete v tématu .exr (Display Exception Record) a .ecxr (Display Exception Context Record).

Zasílání zpráv o chybách systému Windows – q / qd

To, jakým způsobem je ukončena relace ladění, určuje, zda Systém hlášení chyb ve Windows nahlásí selhání.

Pokud je ladicí relace odpojena pomocí qd před uzavřením ladicího programu, WER ohlásí chybu.

Pokud je ladicí relace ukončena pomocí q (nebo pokud je ladicí program zavřený bez odpojení), WER neohlásí chybu.

Připojení ; q nebo ; Qd na konec příkazového řetězce pro vyvolání požadovaného chování.

Pokud například chcete, aby služba WER mohla hlásit selhání po zachycení výpisu paměti CDB, nakonfigurujte tento příkazový řetězec.

<Path>\cdb.exe -p %ld -e %ld -c ".dump /j 0x%p /u c:\Dumps\AeDebug.dmp; qd"

Tento příklad by umožnil službě WER hlásit selhání po zachycení výpisu stavu systému WinDbg.

<Path>\windbg.exe -p %ld -e %ld -c ".dump /j %p /u <DumpPath>\AeDebug.dmp; qd""

Ohrožení zabezpečení

Pokud uvažujete o povolení ladění postmortem na počítači, který sdílíte s dalšími lidmi, přečtěte si téma Zabezpečení během ladění postmortem.