Freigeben über


Aktivieren des Postmortem-Debuggings

Ausnahmebehandlung für den Benutzermodus

Ausnahmen und Haltepunkte

Die häufigsten Anwendungsfehler werden als Ausnahmen bezeichnet. Dazu gehören Zugriffsverletzungen, Division-by-Zero-Fehler, numerische Überläufe, CLR-Ausnahmen und viele andere Arten von Fehlern. Anwendungen können auch Unterbrechungen von Haltepunkten verursachen. Diese treten auf, wenn Windows die Anwendung nicht ausführen kann (z. B. wenn ein erforderliches Modul nicht geladen werden kann) oder wenn ein Haltepunkt gefunden wird. Haltepunkte können von einem Debugger in den Code eingefügt oder über eine Funktion wie DebugBreak aufgerufen werden.

Rangfolge von Ausnahmehandlern

Basierend auf Konfigurationswerten und aktiven Debuggern behandelt Windows Fehler im Benutzermodus auf unterschiedliche Weise. Die folgende Sequenz zeigt die Rangfolge, die für die Fehlerbehandlung im Benutzermodus verwendet wird:

  1. Wenn ein Benutzermodusdebugger zurzeit an den fehlerhaften Prozess angefügt ist, führen alle Fehler dazu, dass das Ziel in diesen Debugger unterteilt wird.

    Solange der Benutzermodusdebugger angefügt ist, werden keine anderen Fehlerbehandlungsmethoden verwendet – auch wenn der Befehl gn (Go With Exception Not Handled) verwendet wird.

  2. Wenn kein Benutzermodusdebugger angefügt ist und der ausführungscode über eigene Ausnahmebehandlungsroutinen verfügt (z . B. try - except), versucht diese Ausnahmebehandlungsroutine, den Fehler zu behandeln.

  3. Wenn kein Benutzermodusdebugger angefügt ist und Windows über eine offene Kerneldebuggingverbindung verfügt und der Fehler ein Unterbrechungspunkt ist, versucht Windows, den Kerneldebugger zu kontaktieren.

    Kerneldebuggingverbindungen müssen während des Startvorgangs von Windows geöffnet werden. Wenn Sie verhindern möchten, dass ein Benutzermodusunterbrechung in den Kerneldebugger einbricht, können Sie das Hilfsprogramm "KDbgCtrl" mit dem Parameter "-du " verwenden. Ausführliche Informationen zum Konfigurieren von Kerneldebuggingverbindungen und zur Verwendung von KDbgCtrl finden Sie unter Getting Set Up for Debugging.

    Im Kerneldebugger können Sie gh (Go With Exception Handled) verwenden, um den Fehler zu ignorieren und die Ausführung des Ziels fortzusetzen. Sie können gn (Go With Exception Not Handled) verwenden, um den Kerneldebugger zu umgehen und zu Schritt 4 zu wechseln.

  4. Wenn die Bedingungen in den Schritten 1, 2 und 3 nicht gelten, aktiviert Windows ein in den AeDebug-Registrierungswerten konfiguriertes Debuggingtool. Jedes Programm kann im Voraus als Tool ausgewählt werden, das in dieser Situation verwendet werden soll. Das ausgewählte Programm wird als Postmortemdebugger bezeichnet.

  5. Wenn die Bedingungen in den Schritten 1, 2 und 3 nicht gelten und kein Postmortemdebugger registriert ist, zeigt Windows-Fehlerberichterstattung (WER) eine Meldung an und stellt ggf. Lösungen bereit. WER schreibt auch eine Speicherabbilddatei, wenn die entsprechenden Werte in der Registrierung festgelegt sind. Weitere Informationen finden Sie unter Verwenden von WER und Sammeln von Benutzermodusabbildern.

DebugBreak-Funktion

Wenn ein Postmortemdebugger installiert wurde, können Sie absichtlich aus einer Benutzermodusanwendung in den Debugger unterteilen, indem Sie die DebugBreak-Funktion aufrufen.

Angeben eines Postmortemdebuggers

In diesem Abschnitt wird beschrieben, wie Tools wie WinDbg als Postmortemdebugger konfiguriert werden. Nach der Konfiguration wird der Postmortemdebugger automatisch gestartet, wenn eine Anwendung abstürzt.

Registrierungsschlüssel nach Mortem Debugger

Windows-Fehlerberichterstattung (WER) erstellt den Postmortemdebuggerprozess mithilfe der im AeDebug-Registrierungsschlüssel festgelegten Werte.

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

Es gibt zwei primäre Registrierungswerte von Interesse, Debugger und Auto. Der Debugger-Registrierungswert gibt die Befehlszeile für den Postmortemdebugger an. Der Wert der automatischen Registrierung gibt an, ob der Postmortemdebugger automatisch gestartet wird oder ob zuerst ein Bestätigungsmeldungsfeld angezeigt wird.

Debugger (REG_SZ)

Dieser REG_SZ Wert gibt den Debugger an, der das Postmortem-Debuggen behandelt.

Der vollständige Pfad zum Debugger muss aufgelistet werden, es sei denn, der Debugger befindet sich in einem Verzeichnis, das sich im Standardpfad befindet.

Die Befehlszeile wird aus der Debuggerzeichenfolge über einen Aufruf im Printf-Stil generiert, der drei Parameter enthält. Obwohl die Reihenfolge behoben ist, muss keine oder alle verfügbaren Parameter verwendet werden.

DWORD (%ld) – Prozess-ID des Zielprozesses.

DWORD (%ld) – Ereignishandle, das in den Postmortemdebuggerprozess dupliziert wurde. Wenn der Postmortemdebugger das Ereignis signalisiert, wird der Zielprozess fortgesetzt, ohne auf das Beenden des Postmortemdebuggers zu warten. Das Ereignis sollte nur signalisiert werden, wenn das Problem behoben wurde. Wenn der Postmortemdebugger beendet wird, ohne das Ereignis zu signalisieren, setzt WER die Sammlung von Informationen über die Zielprozesse fort.

void* (%p) – Adresse einer JIT_DEBUG_INFO Struktur, die im Adressraum des Zielprozesses zugeordnet ist. Die Struktur enthält zusätzliche Ausnahmeinformationen und den Kontext.

Auto (REG_SZ) Dieser REG_SZ Wert ist immer 0 oder 1.

Wenn "Auto " auf "0" festgelegt ist, wird vor dem Start des Postmortem-Debuggingvorgangs ein Bestätigungsmeldungsfeld angezeigt.

Wenn "Auto " auf "1" festgelegt ist, wird der Postmortemdebugger sofort erstellt.

Wenn Sie die Registrierung manuell bearbeiten, gehen Sie dies sehr sorgfältig vor, da fehlerhafte Änderungen an der Registrierung möglicherweise nicht zulassen, dass Windows gestartet werden kann.

Beispiel für die Befehlszeilenverwendung

Viele Postmortemdebugger verwenden eine Befehlszeile, die -p- und -e-Schalter enthält, um anzugeben, dass die Parameter eine PID und ein Ereignis (bzw. ein Ereignis) sind. Beispielsweise erstellt die Installation von WinDbg über windbg.exe -I die folgenden Werte:

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

Es gibt Flexibilität, wie die WER%ld %ld %p-Parameter verwendet werden können. Beispiel: es ist nicht erforderlich, schalter um oder zwischen den WER-Parametern anzugeben. Beispielsweise erstellt die Installation von Windows Sysinternals ProcDump die procdump.exe -i folgenden Werte ohne Schalter zwischen den PARAMETERn WER %ld %ld %p:

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

32- und 64-Bit-Debugger

Auf einer 64-Bit-Plattform werden die Registrierungswerte Debugger (REG_SZ) und Auto (REG_SZ) einzeln für 64-Bit- und 32-Bit-Anwendungen definiert. Mit einem zusätzlichen Windows unter Windows (WOW)-Schlüssel werden die 32-Bit-Debugwerte der 32-Bit-Anwendung gespeichert.

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

Verwenden Sie auf einer 64-Bit-Plattform einen 32-Bit-Debugger für 32-Bit-Prozesse und einen 64-Bit-Debugger für 64-Bit-Prozesse. Dadurch wird verhindert, dass sich ein 64-Bit-Debugger auf die WOW64-Threads anstelle der 32-Bit-Threads in einem 32-Bit-Prozess konzentriert.

Für viele Postmortemdebugger, einschließlich der Debugtools für Windows-Postmortemdebugger, umfasst dies zweimal das Ausführen des Installationsbefehls. einmal mit der x86-Version und einmal mit der x64-Version. Wenn Sie z. B. WinDbg als interaktiven Postmortemdebugger verwenden möchten, wird der windbg.exe -I Befehl zweimal für jede Version ausgeführt.

64-Bit-Installation:

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

Dadurch wird der Registrierungsschlüssel mit diesen Werten aktualisiert.

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-Installation:

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

Dadurch wird der Registrierungsschlüssel mit diesen Werten aktualisiert.

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

Konfigurieren von Post Mortem-Debuggern

Debuggingtools für Windows

Die Debugtools für Windows-Debugger unterstützen alle Unterstützungen, die als Postmortemdebugger festgelegt werden. Der Installationsbefehl beabsichtigt, dass der Prozess interaktiv gedebuggt wird.

WinDbg

Führen Sie zum Festlegen des Postmortemdebuggers auf WinDbg aus windbg -I. (Die I Großschreibung muss großgeschrieben werden.) Dieser Befehl zeigt nach der Verwendung eine Erfolgs- oder Fehlermeldung an. Um sowohl mit 32- als auch mit 64-Bit-Anwendungen zu arbeiten, führen Sie den Befehl für die Beiden Debugger 64 und 32 aus.

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

So wird der Registrierungseintrag "AeDebug" beim windbg -I Ausführen konfiguriert.

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

In den Beispielen ist Path> das Verzeichnis, <in dem sich der Debugger befindet.

Die Parameter "-p" und "-e" übergeben die Prozess-ID und das Ereignis, wie zuvor beschrieben.

Mit "-g" wird der Befehl g (Go) an WinDbg übergeben und die Ausführung von der aktuellen Anweisung fortgesetzt.

Beachten Sie, dass es ein erhebliches Problem gibt, das den Befehl g (Go) übergibt. Das Problem mit diesem Ansatz besteht darin, dass Ausnahmen nicht immer wiederholt werden, in der Regel aufgrund einer vorübergehenden Bedingung, die nicht mehr vorhanden ist, wenn der Code neu gestartet wird. Weitere Informationen zu diesem Problem finden Sie unter .jdinfo (Verwenden von JIT_DEBUG_INFO).For more information about this issue, see .jdinfo (Use JIT_DEBUG_INFO).

Um dieses Problem zu vermeiden, verwenden Sie .jdinfo oder .dump /j. Dieser Ansatz ermöglicht es dem Debugger, sich im Kontext des Codefehlers von Interesse zu befinden. Weitere Informationen finden Sie unter Just In Time (JIT) Debugging weiter unten in diesem Thema.

CDB

Um den Postmortemdebugger auf CDB festzulegen, führen Sie cdb -iae (Install AeDebug) oder cdb -iaec KeyString (Install AeDebug with Command) aus.

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

Wenn der Parameter "-iaec " verwendet wird, gibt KeyString eine Zeichenfolge an, die an das Ende der Befehlszeile angefügt werden soll, die zum Starten des Postmortemdebuggers verwendet wird. Wenn KeyString Leerzeichen enthält, muss sie in Anführungszeichen eingeschlossen werden.

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]

Dieser Befehl zeigt nichts an, wenn er erfolgreich ist, und eine Fehlermeldung, wenn er fehlschlägt.

NTSD

Führen Sie ntsd -iae (Install AeDebug) oder ntsd -iaec KeyString (Install AeDebug with Command) aus, um den Postmortemdebugger auf NTSD festzulegen.

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

Wenn der Parameter "-iaec " verwendet wird, gibt KeyString eine Zeichenfolge an, die an das Ende der Befehlszeile angefügt werden soll, die zum Starten des Postmortemdebuggers verwendet wird. Wenn KeyString Leerzeichen enthält, muss sie in Anführungszeichen eingeschlossen werden.

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]

Dieser Befehl zeigt nichts an, wenn er erfolgreich ist, und ein Fehler bei einem fehler in einem neuen Konsolenfenster.

Hinweis : Da die Parameter -p %ld -e %ld -g immer zuerst in der Befehlszeile des Postmortemdebuggers angezeigt werden, sollten Sie den Switch -iaec nicht verwenden, um den Parameter -server anzugeben, da -server nicht funktioniert, es sei denn, er wird zuerst in der Befehlszeile angezeigt. Um einen Postmortemdebugger zu installieren, der diesen Parameter enthält, müssen Sie die Registrierung manuell bearbeiten.

Visual Studio JIT Debugger

Wenn Visual Studio installiert wurde, wird vsjitdebugger.exe als Post mortem-Debugger registriert. Der JIT-Debugger von Visual Studio beabsichtigt, dass der Prozess interaktiv gedebuggt wird.

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

Wenn Visual Studio aktualisiert oder neu installiert wird, wird dieser Eintrag neu geschrieben, wobei alle alternativen Werte überschrieben werden.

Window Sysinternals ProcDump

Das Windows Sysinternals ProcDump-Hilfsprogramm kann auch für die Aufnahme nach demMortem-Dump verwendet werden. Weitere Informationen zum Verwenden und Herunterladen von ProcDump finden Sie unter ProcDump.

Wie der .dump WinDbg-Befehl kann ProcDump ein Abbild des Absturzes nicht interaktiv erfassen. Die Erfassung kann in jeder Windows-Systemsitzung auftreten.

ProcDump beendet, wenn die Abbilddateierfassung abgeschlossen ist, meldet WER dann den Fehler und den fehlerhaften Prozess wird beendet.

Hier erfahren procdump -i Sie, wie Sie procdump und -you zum Deinstallieren von ProcDump sowohl für das 32- als auch für das 64-Bit-Post Mortem-Debugging installieren.

<Path>\procdump.exe -i

Die Installations- und Deinstallationsbefehle geben die Registrierungswerte aus, die bei Erfolg geändert wurden, und die Fehler beim Fehler.

Die ProcDump-Befehlszeilenoptionen in der Registrierung sind auf Folgendes festgelegt:

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

ProcDump verwendet alle drei Parameter – PID, Event und JIT_DEBUG_INFO. Weitere Informationen zum JIT_DEBUG_INFO-Parameter finden Sie unten unter Just In Time (JIT) Debugging .

Die Größe des erfassten Dumps ist standardmäßig auf Mini (Prozess/Threads/Handles/Module/Adressraum) ohne Größenoptionssatz, MiniPlus (Mini plus MEM_PRIVATE Seiten) mit -mp set oder Full (alle Arbeitsspeicher - entspricht ".dump /mA") mit -ma set.

Für Systeme mit ausreichendem Laufwerksspeicher wird eine vollständige Aufnahme (-ma) empfohlen.

Verwenden Sie "-ma" mit der Option "-i", um eine gesamte Speicheraufnahme anzugeben. Geben Sie optional einen Pfad für die Speicherabbilddateien an.

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

Für Systeme mit begrenztem Speicherplatz wird eine MiniPlus-Aufnahme (-mp) empfohlen.

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

Der Ordner zum Speichern der Speicherabbilddatei ist optional. Der Standardwert ist der aktuelle Ordner. Der Ordner sollte mit einer ACL gesichert werden, die gleich oder besser ist als das, was für C:\Windows\Temp verwendet wird. Weitere Informationen zum Verwalten von Sicherheit im Zusammenhang mit Ordnern finden Sie unter "Sicherheit während des Postmortem-Debuggings".

Um ProcDump als Postmortemdebugger zu deinstallieren und die vorherigen Einstellungen wiederherzustellen, verwenden Sie die Option -u (Deinstallieren).

<Path>\procdump.exe -u

Weitere Informationen zu ProcDump finden Sie unter "ProcDump " und "Windows SysInternals Administrator" von Mark Russinovich und Aaron Margosis, die von Microsoft Press veröffentlicht wurden.

Just In Time (JIT) Debugging

Festlegen des Kontexts auf die fehlerhafte Anwendung

Wie bereits erwähnt, ist es sehr wünschenswert, den Kontext auf die Ausnahme festzulegen, die den Absturz mit dem parameter JIT_DEBUG_INFO verursacht hat. Weitere Informationen hierzu finden Sie unter .jdinfo (Verwenden von JIT_DEBUG_INFO).For more information about this, see .jdinfo (Use JIT_DEBUG_INFO).

Debuggingtools für Windows

In diesem Beispiel wird gezeigt, wie Sie die Registrierung bearbeiten, um einen anfänglichen Befehl (-c) auszuführen, der den JDINFO-Adressbefehl <> verwendet, um die zusätzlichen Ausnahmeinformationen anzuzeigen, und den Kontext an den Speicherort der Ausnahme ändern (ähnlich wie ecxr verwendet wird, wird der Kontext auf den Ausnahmedatensatz festgelegt).

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

Der Parameter %p ist die Adresse einer JIT_DEBUG_INFO Struktur im Adressraum des Zielprozesses. Der Parameter "%p" wird vorab mit 0x angefügt, sodass er als Hexwert interpretiert wird. Weitere Informationen finden Sie unter .jdinfo (Verwenden von JIT_DEBUG_INFO).For more information, see .jdinfo (Use JIT_DEBUG_INFO).

Zum Debuggen einer Mischung aus 32- und 64-Bit-Apps konfigurieren Sie sowohl die 32- als auch die 64-Bit-Registrierungsschlüssel (siehe oben), und legen Sie den richtigen Pfad zum Speicherort der 64-Bit- und 32-Bit-WinDbg.exe fest.

Erstellen einer Dumpdatei mithilfe von DUMP

Um eine Dumpdatei zu erfassen, wenn ein Fehler auftritt, der die JIT_DEBUG_INFO Daten enthält, verwenden Sie .dump /j <address>.

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

Verwenden Sie die Option "/u", um einen eindeutigen Dateinamen zu generieren, damit mehrere Dumpdateien automatisch erstellt werden können. Weitere Informationen zu den Optionen finden Sie unter .dump (Create Dump File).

Das erstellte Dump enthält die JITDEBUG_INFO Daten, die als Standardausnahmekontext gespeichert sind. Anstatt jdinfo zum Anzeigen der Ausnahmeinformationen zu verwenden und den Kontext festzulegen, verwenden Sie ".exr-1", um den Ausnahmedatensatz und ".ecxr" anzuzeigen, um den Kontext festzulegen. Weitere Informationen finden Sie unter .exr (Display Exception Record) und ECXR (Display Exception Context Record).For more information see .exr (Display Exception Record) and .ecxr (Display Exception Context Record).

Windows-Fehlerberichterstattung - q / qd

Die Art und Weise, wie die Debugsitzung beendet wird, bestimmt, ob Windows-Fehlerberichterstattung den Fehler meldet.

Wenn die Debugsitzung vor dem Schließen des Debuggers mithilfe von qd getrennt wird, meldet WER den Fehler.

Wenn die Debugsitzung mit q beendet wird (oder wenn der Debugger ohne Trennen geschlossen wird), meldet WER den Fehler nicht.

Append ; q oder ; qd bis zum Ende der Befehlszeichenfolge, um das gewünschte Verhalten aufzurufen.

Wenn SIE beispielsweise zulassen möchten, dass WER den Fehler meldet, nachdem CDB ein Dump erfasst hat, konfigurieren Sie diese Befehlszeichenfolge.

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

In diesem Beispiel könnte WER den Fehler melden, nachdem WinDbg ein Abbild erfasst hat.

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

Sicherheitsrisiken

Wenn Sie das Postmortem-Debugging auf einem Computer aktivieren, den Sie für andere Personen freigeben, lesen Sie "Sicherheit während des Postmortem-Debuggings".