Delen via


Postmortem foutopsporing inschakelen

Afhandeling van uitzonderingen in gebruikersmodus

Uitzonderingen en onderbrekingspunten

De meest voorkomende toepassingsfouten worden uitzonderingen genoemd. Dit zijn onder andere toegangsschendingen, fouten met delen per nul, numerieke overloop, CLR-uitzonderingen en vele andere soorten fouten. Toepassingen kunnen ook breakpoint-interrupties veroorzaken. Deze treden op wanneer Windows de toepassing niet kan uitvoeren (bijvoorbeeld wanneer een benodigde module niet kan worden geladen) of wanneer er een onderbrekingspunt wordt aangetroffen. Onderbrekingspunten kunnen worden ingevoegd in de code door een foutopsporingsprogramma of worden aangeroepen via een functie zoals DebugBreak.

Prioriteit van uitzonderingshandlers

Op basis van configuratiewaarden en welke foutopsporingsprogramma's actief zijn, verwerkt Windows op verschillende manieren fouten in de gebruikersmodus. In de volgende volgorde ziet u de prioriteit die wordt gebruikt voor foutafhandeling in de gebruikersmodus:

  1. Als er momenteel een foutopsporingsprogramma in de gebruikersmodus is gekoppeld aan het foutopsporingsproces, worden alle fouten veroorzaakt dat het doel in dit foutopsporingsprogramma inbraakt.

    Zolang het foutopsporingsprogramma voor de gebruikersmodus is gekoppeld, worden er geen andere methoden voor foutafhandeling gebruikt, zelfs als de opdracht gn (Go with Exception Not Handled) wordt gebruikt.

  2. Als er geen foutopsporingsprogramma voor de gebruikersmodus is gekoppeld en de uitvoercode een eigen routine voor het afhandelen van uitzonderingen heeft (bijvoorbeeld proberen - behalve), probeert deze routine voor het afhandelen van uitzonderingen de fout af te handelen.

  3. Als er geen foutopsporingsprogramma voor gebruikersmodus is gekoppeld en Windows een open kernelfoutopsporingsverbinding heeft en de fout een onderbrekingspuntonderbreking is, probeert Windows contact op te maken met het kernelfoutopsporingsprogramma.

    Kernelfoutopsporingsverbindingen moeten worden geopend tijdens het opstartproces van Windows. Als u wilt voorkomen dat een onderbreking in de gebruikersmodus de kernelfoutopsporingsprogramma onderbreekt, kunt u het hulpprogramma KDbgCtrl gebruiken met de parameter -du. Zie Instellen voor foutopsporing voor kernel voor meer informatie over het configureren van kernelfoutopsporingsverbindingen en het gebruik van KDbgCtrl.

    In het kernelfoutopsporingsprogramma kunt u gh (Go with Exception Handled) gebruiken om de fout te negeren en door te gaan met het uitvoeren van het doel. U kunt gn (Go with Exception Not Handled) gebruiken om het kernelfoutopsporingsprogramma te omzeilen en verder te gaan met stap 4.

  4. Als de voorwaarden in stap 1, 2 en 3 niet van toepassing zijn, activeert Windows een foutopsporingsprogramma dat is geconfigureerd in de registerwaarden AeDebug. Elk programma kan vooraf worden geselecteerd als het hulpprogramma dat in deze situatie moet worden gebruikt. Het gekozen programma wordt het postmortem-foutopsporingsprogramma genoemd.

  5. Als de voorwaarden in stap 1, 2 en 3 niet van toepassing zijn en er geen postmortem-foutopsporingsprogramma is geregistreerd, wordt in Windows Foutrapportage (WER) een bericht weergegeven en worden er oplossingen geboden als deze beschikbaar zijn. WER schrijft ook een geheugendumpbestand als de juiste waarden zijn ingesteld in het register. Voor meer informatie, zie WER gebruiken en dumps User-Mode verzamelen.

DebugBreak-functie

Als er een postmortem-foutopsporingsprogramma is geïnstalleerd, kunt u opzettelijk in het foutopsporingsprogramma inbreken vanuit een toepassing in de gebruikersmodus door de functie DebugBreak aan te roepen.

Een Postmortem Debugger specificeren

In deze sectie wordt beschreven hoe u hulpprogramma's zoals WinDbg configureert als het postmortem-foutopsporingsprogramma. Zodra dit is geconfigureerd, wordt het postmortem-foutopsporingsprogramma automatisch gestart wanneer een toepassing vastloopt.

Registersleutels voor Post Mortem Debugger

Windows Error Reporting (WER) maakt het postmortem debugger-proces met behulp van de waarden die zijn ingesteld in de registersleutel AeDebug.

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

Er zijn twee primaire registerwaarden van belang, Foutopsporingsprogramma en Auto. De registerwaarde Foutopsporingsprogramma geeft de opdrachtregel voor de post-mortem foutopsporing aan. De waarde van het automatische register geeft aan of het foutopsporingsprogramma voor postmortem automatisch wordt gestart of als er eerst een bevestigingsbericht wordt weergegeven.

Foutopsporingsprogramma (REG_SZ)

Met deze REG_SZ waarde geeft u het foutopsporingsprogramma op dat postmortem-foutopsporing afhandelt.

Het volledige pad naar het foutopsporingsprogramma moet worden vermeld, tenzij het foutopsporingsprogramma zich in een map bevindt die zich in het standaardpad bevindt.

De opdrachtregel wordt gegenereerd op basis van de tekenreeks voor foutopsporing via een aanroep in de printf-stijl die drie parameters bevat. Hoewel de volgorde is opgelost, hoeft u geen of alle beschikbare parameters te gebruiken.

DWORD (%ld) - Proces-id van het doelproces.

DWORD (%ld) - Gebeurtenisgreep gedupliceerd in het postmortem-debuggerproces. Als het postmortem-foutopsporingsprogramma de gebeurtenis aangeeft, wordt het doelproces voortgezet zonder te wachten tot het postmortem-foutopsporingsprogramma wordt beëindigd. De gebeurtenis mag alleen worden gesignaleerd als het probleem is opgelost. Als het foutopsporingsprogramma voor postmortem wordt beëindigd zonder de gebeurtenis te signaleren, gaat WER verder met het verzamelen van informatie over de doelprocessen.

void* (%p) - Adres van een JIT_DEBUG_INFO structuur die is toegewezen in de adresruimte van het doelproces. De structuur bevat aanvullende informatie over uitzonderingen en context.

Automatisch (REG_SZ) Deze REG_SZ waarde is altijd 0 of 1.

Als Automatisch is ingesteld op 0, wordt er een bevestigingsbericht weergegeven voordat het foutopsporingsproces voor postmortem wordt gestart.

Als Auto is ingesteld op 1, wordt de postmortem debugger onmiddellijk gemaakt.

Wanneer u het register handmatig bewerkt, moet u dit zorgvuldig doen, omdat onjuiste wijzigingen in het register Windows mogelijk niet toestaan om op te starten.

Voorbeeld van opdrachtregelgebruik

Veel postmortem-foutopsporingsprogramma's gebruiken een opdrachtregel met -p en -e switches om aan te geven dat de parameters respectievelijk een PID en gebeurtenis zijn. Als u bijvoorbeeld WinDbg installeert via windbg.exe -I , worden de volgende waarden gemaakt:

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

Er is flexibiliteit in hoe de WER-%ld %ld %p parameters kunnen worden gebruikt. Bijvoorbeeld. er is geen vereiste om schakelopties rond of tussen de WER-parameters op te geven. Als u bijvoorbeeld Windows Sysinternals ProcDump installeert met behulp van procdump.exe -i, worden de volgende waarden zonder opties aangemaakt tussen de WER-%ld %ld %p parameters:

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

32- en 64-bits foutopsporingsprogramma's

Op een 64-bits platform worden de registerwaarden voor foutopsporing (REG_SZ) en Auto (REG_SZ) afzonderlijk gedefinieerd voor 64-bits en 32-bits toepassingen. Een aanvullende Windows on Windows (WOW)-sleutel wordt gebruikt voor het opslaan van post mortem-foutopsporingsgegevens van 32-bits toepassingen.

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

Gebruik op een 64-bits platform een 32-bits post-mortem-foutopsporingsprogramma voor 32-bits processen en een 64-bits foutopsporingsprogramma voor 64-bits processen. Dit voorkomt een 64-bits foutopsporingsprogramma dat zich richt op de WOW64-threads, in plaats van de 32-bits threads, in een 32-bits proces.

Voor veel postmortem-foutopsporingsprogramma's, waaronder de Foutopsporingsprogramma's voor Windows postmortem-foutopsporingsprogramma's, moet de installatieopdracht twee keer worden uitgevoerd; eenmaal met de x86-versie en eenmaal met de x64-versie. Als u bijvoorbeeld WinDbg wilt gebruiken als het interactieve postmortem-foutopsporingsprogramma, wordt de windbg.exe -I opdracht twee keer uitgevoerd, één keer voor elke versie.

64-bit Installatie:

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

Hiermee wordt de registersleutel bijgewerkt met deze waarden.

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

32-bit Installatie:

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

Hiermee wordt de registersleutel bijgewerkt met deze waarden.

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

Configureren van post-mortemfoutopsporingsprogramma's

Hulpprogramma's voor foutopsporing voor Windows

De foutopsporingsprogramma's voor Windows debuggers kunnen allemaal worden ingesteld als post-mortem-foutopsporingsprogramma. De installatieopdracht is van plan om interactief fouten op te sporen in het proces.

WinDbg

Als u de postmortem-foutopsporing wilt instellen op WinDbg, voert u windbg -I uit. (De I hoofdletter moet zijn.) Met deze opdracht wordt een geslaagde of mislukte melding weergegeven nadat deze is gebruikt. Als u wilt werken met zowel 32- als 64-bits toepassingen, voert u de opdracht uit voor de 64- en 32-foutopsporingsprogramma's.

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

Dit is hoe de registervermelding AeDebug wordt geconfigureerd wanneer windbg -I wordt uitgevoerd.

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

In de voorbeelden <is Path> de map waarin het foutopsporingsprogramma zich bevindt.

De parameters -p en -e geven de proces-id en gebeurtenis door, zoals eerder is besproken.

De -g geeft de opdracht g (Go) door aan WinDbg en gaat door met de uitvoering van de huidige instructie.

Notitie Er is een belangrijk probleem waarbij de opdracht g (Go) wordt doorgegeven. Het probleem met deze benadering is dat uitzonderingen niet altijd herhalen, meestal vanwege een tijdelijke voorwaarde die niet meer bestaat wanneer de code opnieuw wordt opgestart. Zie .jdinfo (Gebruik JIT_DEBUG_INFO) voor meer informatie over dit probleem.

Gebruik .jdinfo of .dump /j om dit probleem te voorkomen. Met deze aanpak kan het foutopsporingsprogramma zich in de context bevinden van de codefout die van belang is. Zie Just-In-Time -foutopsporing verderop in dit onderwerp voor meer informatie.

CDB

Als u het postmortem-foutopsporingsprogramma wilt instellen op CDB, voert u cdb -iae (Install AeDebug) of cdb -iaecKeyString (Install AeDebug with Command) uit.

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

Wanneer de parameter -iaec wordt gebruikt, geeft KeyString een tekenreeks op die moet worden toegevoegd aan het einde van de opdrachtregel die wordt gebruikt om het postmortem-foutopsporingsprogramma te starten. Als KeyString spaties bevat, moet deze tussen aanhalingstekens staan.

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]

Bij dit commando wordt niets weergegeven als het slaagt, en een foutmelding als het mislukt.

NTSD

Als u het postmortem-foutopsporingsprogramma wilt instellen op NTSD, voert u ntsd -iae (Install AeDebug) of ntsd -iaecKeyString (Install AeDebug with Command) uit.

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

Wanneer de parameter -iaec wordt gebruikt, geeft KeyString een tekenreeks op die moet worden toegevoegd aan het einde van de opdrachtregel die wordt gebruikt om het postmortem-foutopsporingsprogramma te starten. Als KeyString spaties bevat, moet deze tussen aanhalingstekens staan.

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]

Als deze opdracht slaagt, wordt niets weergegeven; bij een fout wordt een foutbericht in een nieuw consolevenster weergegeven.

Notitie Omdat de -p %ld -e %ld -g parameters altijd eerst worden weergegeven op de opdrachtregel van het foutopsporingsprogramma voor postmortem, moet u de -iaec schakeloptie niet gebruiken om de parameter -server op te geven, omdat -server niet werkt, tenzij deze eerst op de opdrachtregel wordt weergegeven. Als u een postmortem-foutopsporingsprogramma wilt installeren dat deze parameter bevat, moet u het register handmatig bewerken.

Visual Studio JIT-foutopsporingsprogramma

Als Visual Studio geïnstalleerd is, wordt vsjitdebugger.exe geregistreerd als het post-mortem hulpmiddel voor foutopsporing. Het Visual Studio JIT-foutopsporingsprogramma is van plan om interactief fouten op te sporen in het proces.

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

Als Visual Studio wordt bijgewerkt of opnieuw geïnstalleerd, wordt deze vermelding herschreven en eventuele alternatieve waarden overschreven.

Windows Sysinternals ProcDump

Het hulpprogramma Windows Sysinternals ProcDump kan ook worden gebruikt voor het vastleggen van postmortem-dumps. Zie ProcDump voor meer informatie over het gebruik en downloaden van ProcDump.

Net als de WinDbg-opdracht .dump kan ProcDump een dump van de crash niet-interactief vastleggen. De opname kan plaatsvinden in een Windows-systeemsessie.

ProcDump wordt afgesloten wanneer het vastleggen van het dumpbestand is voltooid, waarna WER de fout rapporteert en het foutproces wordt beëindigd.

Gebruik procdump -i om ProcDump te installeren en -u om het te verwijderen voor zowel 32- als 64-bits post-mortemfoutopsporing.

<Path>\procdump.exe -i

Bij de opdrachten voor installeren en verwijderen worden de gewijzigde registerwaarden weergegeven bij succes en de fouten bij mislukkingen.

De opdrachtregelopties van ProcDump in het register zijn ingesteld op:

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

ProcDump gebruikt alle drie parameters: PID, Gebeurtenis en JIT_DEBUG_INFO. Zie JIT-foutopsporing (Just-In-Time) hieronder voor meer informatie over de parameter JIT_DEBUG_INFO.

De grootte van de vastgelegde dump wordt standaard ingesteld op Mini (processen/threads/handles/modules/adresruimte) zonder dat er een optie voor grootte is ingesteld, Mini-Plus (Mini plus MEM_PRIVATE-pagina's) als -mp is ingesteld, of Volledig (alle geheugen - equivalent aan ".dump /mA") als -ma is ingesteld.

Voor systemen met voldoende schijfruimte wordt een volledige (-ma) opname aanbevolen.

Gebruik -ma met de optie -i om een volledige geheugenopname op te geven. Geef desgewenst een pad op voor de dumpbestanden.

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

Voor systemen met beperkte schijfruimte wordt een MiniPlus -opname (-mp) aanbevolen.

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

De map waarnaar het dumpbestand moet worden opgeslagen, is optioneel. De standaardwaarde is de huidige map. De map moet worden beveiligd met een ACL die gelijk is aan of beter is dan wat wordt gebruikt voor C:\Windows\Temp. Zie Security During Postmortem Debugging (Beveiliging tijdens foutopsporing postmortem) voor meer informatie over het beheren van beveiliging met betrekking tot mappen.

Als u ProcDump wilt verwijderen als het postmortem-foutopsporingsprogramma en de vorige instellingen wilt herstellen, gebruikt u de optie -u (Verwijderen).

<Path>\procdump.exe -u

Zie ProcDump en Windows SysInternals Administrator Reference by Mark Russinovich en Aaron Margosis gepubliceerd door Microsoft Press voor meer informatie over ProcDump.

Just In Time (JIT) debuggen

Context instellen op de foutieve toepassing

Zoals eerder besproken, is het zeer wenselijk om de context in te stellen op de uitzondering die de crash heeft veroorzaakt met behulp van de parameter JIT_DEBUG_INFO. Zie .jdinfo (Gebruik JIT_DEBUG_INFO) voor meer informatie hierover.

Hulpprogramma's voor foutopsporing voor Windows

In dit voorbeeld ziet u hoe u het register bewerkt om een initiële opdracht (-c) uit te voeren die gebruikmaakt van de opdracht .jdinfo-adres <> om de aanvullende uitzonderingsgegevens weer te geven en de context te wijzigen in de locatie van de uitzondering (vergelijkbaar met de manier waarop .ecxr wordt gebruikt, stelt u de context in op de uitzonderingsrecord).

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

De parameter %p is het adres van een JIT_DEBUG_INFO structuur in de adresruimte van het doelproces. De parameter %p wordt vooraf toegevoegd met 0x, zodat deze wordt geïnterpreteerd als een hexwaarde. Zie .jdinfo (gebruik JIT_DEBUG_INFO) voor meer informatie.

Als u fouten wilt opsporen in een combinatie van 32- en 64-bits apps, configureert u zowel de 32- als 64-bits registersleutels (hierboven beschreven), waarbij u het juiste pad instelt op de locatie van de 64-bits en 32-bits WinDbg.exe.

Een dumpbestand maken met behulp van .dump

Als u een dumpbestand wilt vastleggen wanneer er een fout optreedt die de JIT_DEBUG_INFO gegevens bevat, gebruikt u het .dump/j-adres<>.

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

Gebruik de optie /u om een unieke bestandsnaam te genereren zodat meerdere dumpbestanden automatisch kunnen worden gemaakt. Zie .dump (Dump-bestand maken) voor meer informatie over de opties.

De gemaakte dump bevat de JITDEBUG_INFO gegevens die zijn opgeslagen als de standaardcontext voor uitzonderingen. In plaats van .jdinfo te gebruiken om de uitzonderingsgegevens weer te geven en de context in te stellen, gebruikt u .exr -1 om de uitzonderingsrecord en .ecxr weer te geven om de context in te stellen. Zie .exr (Uitzonderingsrecord weergeven) en .ecxr (Contextrecord van uitzondering weergeven) voor meer informatie.

Windows Foutrapportage - q / qd

De manier waarop de foutopsporingssessie eindigt, bepaalt of Windows Foutrapportage de fout rapporteert.

Als de foutopsporingssessie wordt losgekoppeld met behulp van qd vóór het sluiten van het foutopsporingsprogramma, rapporteert WER de fout.

Als de foutopsporingssessie wordt afgesloten met q (of als het foutopsporingsprogramma wordt gesloten zonder loskoppelen), rapporteert WER de fout niet.

Toevoegen ; q of ; qd aan het einde van de opdrachtreeks om het gewenste gedrag aan te roepen.

Als u bijvoorbeeld wilt toestaan dat WER de fout rapporteert nadat CDB een dump heeft vastgelegd, configureert u deze opdrachtreeks.

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

In dit voorbeeld kan WER de fout melden nadat WinDbg een dump heeft vastgelegd.

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

Beveiligingsproblemen

Als u overweegt postmortem-foutopsporing in te schakelen op een computer die u met anderen deelt, raadpleegt u Security During Postmortem Debugging.