Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Sie können Ausnahmen in Benutzermodus- und Kernelmodusanwendungen mithilfe einer Vielzahl von Methoden abfangen und verarbeiten. Ein aktiver Debugger, ein Postmortemdebugger oder eine interne Fehlerbehandlungsroutine sind alle gängigen Methoden zum Behandeln von Ausnahmen.
Weitere Informationen zur Rangfolge dieser verschiedenen Ausnahmehandler finden Sie unter Aktivieren des Postmortem-Debuggings.
Wenn das Microsoft Windows-Betriebssystem einem Debugger die Behandlung einer Ausnahme zulässt, bricht die Anwendung, die die Ausnahme generiert hat, in den Debugger ein . Das heißt, die Anwendung stoppt, und der Debugger wird aktiv. Der Debugger kann dann die Ausnahme auf irgendeine Weise behandeln oder die Situation analysieren. Der Debugger kann dann den Prozess beenden oder die Ausführung fortsetzen lassen.
Wenn der Debugger die Ausnahme ignoriert und die Ausführung der Anwendung ermöglicht, sucht das Betriebssystem nach anderen Ausnahmehandlern, als wäre kein Debugger vorhanden. Wenn die Ausnahme behandelt wird, wird die Anwendung weiterhin ausgeführt. Wenn die Ausnahme jedoch nicht behandelt wird, erhält der Debugger eine zweite Gelegenheit, sich mit der Situation zu befassen.
Verwenden des Debuggers zum Analysieren einer Ausnahme
Wenn eine Ausnahme oder ein Ereignis in den Debugger unterbricht, können Sie den Debugger verwenden, um den ausgeführten Code und den von der Anwendung verwendeten Arbeitsspeicher zu untersuchen. Wenn Sie bestimmte Mengen ändern oder zu einem anderen Punkt in der Anwendung springen, können Sie möglicherweise die Ursache der Ausnahme entfernen.
Sie können die Ausführung fortsetzen, indem Sie einen Gh -Befehl (Gehe mit Ausnahme behandelt) oder gn (Mit Ausnahme nicht behandelt) ausgeben.
Wenn Sie den gn-Befehl in der zweiten Gelegenheit des Debuggers zur Behandlung der Ausnahme ausgeben, endet die Anwendung.
Kernel-Mode Ausnahmen
Ausnahmen, die im Kernelmoduscode auftreten, sind schwerwiegender als Benutzermodus-Ausnahmen. Wenn Kernelmodus-Ausnahmen nicht behandelt werden, wird eine Fehlerüberprüfung ausgegeben und das System beendet.
Wie bei Ausnahmen im Benutzermodus wird der Debugger benachrichtigt, bevor der Fehlerprüfungsbildschirm (auch als Blauer Bildschirm bezeichnet) angezeigt wird, wenn ein Kernelmodusdebugger an das System angefügt ist. Wenn kein Debugger angefügt ist, wird der Fehlerprüfungsbildschirm angezeigt. In diesem Fall kann das Betriebssystem eine Absturzabbilddatei erstellen.
Steuern von Ausnahmen und Ereignissen aus dem Debugger
Sie können den Debugger so konfigurieren, dass er auf bestimmte Ausnahmen und Ereignisse reagiert.
Der Debugger kann den Unterbrechungsstatus für jede Ausnahme oder jedes Ereignis festlegen:
Das Ereignis kann einen Bruch in den Debugger verursachen, sobald es auftritt (die "erste Chance").
Das Ereignis kann unterbrochen werden, nachdem anderen Fehlerhandlern die Möglichkeit gegeben wurden, zu reagieren (die zweite Chance).
Das Ereignis kann auch den Debugger eine Nachricht senden, aber die Ausführung fortsetzen.
Der Debugger kann das Ereignis ignorieren.
Der Debugger kann auch den Behandlungsstatus für jede Ausnahme und jedes Ereignis festlegen. Der Debugger kann das Ereignis wie eine behandelte Ausnahme oder eine unbehandelte Ausnahme behandeln. (Natürlich erfordern Ereignisse, die keine Fehler sind, keine Behandlung.)
Sie können den Unterbrechungsstatus und den Behandlungsstatus steuern, indem Sie eine der folgenden Aktionen ausführen:
Verwenden Sie den Befehl "SXE", "SXD", "SXN" oder "SXI" im Fenster "Debuggerbefehle".
(CDB und NTSD) Verwenden Sie die Option -x, -xe, -xd, -xn oder -xi in der Befehlszeile.
(CDB, NTSD und KD) Verwenden Sie das Schlüsselwort "sxe " oder "sxd " in der dateiTools.ini .
(Nur WinDbg) Wählen Sie " Ereignisfilter" im Menü " Debuggen " aus, um das Dialogfeld " Ereignisfilter " zu öffnen, und wählen Sie dann die gewünschten Optionen aus.
Der Befehl "SX\*", die Befehlszeilenoption "-x\*" und das Schlüsselwort sx\* Tools.ini legen normalerweise den Unterbrechungsstatus des angegebenen Ereignisses fest. Sie können die Option "-h" hinzufügen, damit stattdessen der Behandlungsstatus festgelegt wird.
Es gibt vier spezielle Ereigniscodes (cc, hc, bpec und ssec), die immer den Behandlungsstatus anstelle des Unterbrechungsstatus angeben.
Sie können die letzte Ausnahme oder das letzte Ereignis anzeigen, indem Sie den Befehl ".lastevent" (Last Event anzeigen) verwenden.
Verwalten des Unterbrechungsstatus
Wenn Sie den Unterbrechungsstatus einer Ausnahme oder eines Ereignisses festlegen, können Sie die folgenden Optionen verwenden.
| Command | Statusname | Description |
|---|---|---|
| SXE oder -xe | Break (Aktiviert) |
Wenn diese Ausnahme auftritt, wechselt das Ziel sofort in den Debugger. Dieser Abbruch erfolgt, bevor andere Fehlerbehandlungsroutinen aktiviert werden. Diese Methode wird als First-Chance-Behandlung bezeichnet. |
| SXD oder -xd | Zweite Chance-Pause (Deaktiviert) |
Der Debugger bricht für diese Art von Ausnahme des ersten Zufalls nicht ein (obwohl eine Meldung angezeigt wird). Wenn andere Fehlerhandler diese Ausnahme nicht beheben können, wird die Ausführung beendet, und das Ziel wechselt in den Debugger. Diese Methode wird als Second-Chance-Behandlung bezeichnet. |
| SXN oder -xn | Output (Benachrichtigen) |
Wenn diese Ausnahme auftritt, bricht die Zielanwendung überhaupt nicht in den Debugger auf. Es wird jedoch eine Meldung angezeigt, die den Benutzer über diese Ausnahme informiert. |
| SXI oder -xi | Ignorieren |
Wenn diese Ausnahme auftritt, bricht die Zielanwendung nicht in den Debugger ein, und es wird keine Meldung angezeigt. |
Wenn eine Ausnahme von einer SX*-Einstellung nicht erwartet wird, wechselt die Zielanwendung bei der zweiten Gelegenheit in den Debugger-Modus. Der Standardstatus für Ereignisse wird im folgenden Abschnitt "Ereignisdefinitionen und Standardwerte" dieses Themas aufgeführt.
Um den Unterbrechungsstatus mithilfe der grafischen Benutzeroberfläche von WinDbg festzulegen, wählen Sie im Menü "Debug" das gewünschte Ereignis aus der Liste im Dialogfeld "Ereignisfilter" aus, und wählen Sie dann "Aktiviert", "Deaktiviert", "Ausgabe" oder "Ignorieren" aus.
Überwachen und Steuern des Verarbeitungsstatus
Alle Ereignisse werden als unbehandelt betrachtet, es sei denn, Sie verwenden den Befehl gh (Go with Exception Handled).
Alle Ausnahmen werden als unbehandelt betrachtet, es sei denn, Sie verwenden den Befehl sx\* zusammen mit der Option -h .
Darüber hinaus können SX*-Optionen den Behandlungsstatus für ungültige Handles, STATUS_BREAKPOINT Unterbrechungsanweisungen und Einzelschritt-Ausnahmen konfigurieren. (Diese Konfiguration unterscheidet sich von der Unterbrechungskonfiguration.) Wenn Sie den Unterbrechungsstatus konfigurieren, heißen diese Ereignisse "ch", "bpe" bzw. "sse". Wenn Sie den Verarbeitungsstatus konfigurieren, werden diese Ereignisse hc, bpec und ssec genannt. (Die vollständige Auflistung der Ereignisse finden Sie im folgenden Abschnitt "Ereignisdefinitionen und Standardwerte".)
Sie können den Behandlungsstatus für das STRG+C-Ereignis (cc) konfigurieren, aber nicht den Unterbrechungsstatus. Wenn eine Anwendung ein STRG+C-Ereignis empfängt, wechselt die Anwendung immer in den Debugger.
Wenn Sie den SX*-Befehl für cc-, hc-, bpec- und ssec-Ereignisse verwenden oder wenn Sie den SX*-Befehl zusammen mit der Option "-h " für eine Ausnahme verwenden, treten die folgenden Aktionen auf.
| Command | Statusname | Description |
|---|---|---|
SXE |
Gehandhabt |
Das Ereignis gilt als behandelt, wenn die Ausführung fortgesetzt wird. |
SXD,SXN,SXI |
Nicht verarbeitet |
Das Ereignis wird beim Fortsetzen der Ausführung nicht behandelt. |
Wenn Sie den Behandlungsstatus mithilfe der grafischen Benutzeroberfläche von WinDbg festlegen möchten, wählen Sie im Menü "Debuggen" die Option "Ereignisfilter" aus, wählen Sie das gewünschte Ereignis aus der Liste im Dialogfeld "Ereignisfilter" aus, und wählen Sie dann "Handled" oder "Nicht behandelt" aus.
Automatische Befehle
Mit dem Debugger können Sie auch Befehle festlegen, die automatisch ausgeführt werden, wenn das Ereignis oder die Ausnahme zu einem Haltepunkt im Debugger führt. Sie können eine Befehlszeichenfolge für die Erst-Chance-Ausnahme und eine Befehlszeichenfolge für die Zweit-Chance-Ausnahme festlegen. Sie können diese Zeichenfolgen mit dem Befehl SX\* oder dem Befehl Debug | Ereignisfilter festlegen. Jede Befehlszeichenfolge kann mehrere Befehle enthalten, die durch Semikolons getrennt sind.
Diese Befehle werden unabhängig vom Unterbrechungsstatus ausgeführt. Das heißt, wenn der Unterbrechungsstatus "Ignorieren" lautet, wird der Befehl weiterhin ausgeführt. Wenn der Unterbrechungsstatus "Second-Chance-Break" lautet, wird der Befehl "Erste Chance" beim ersten Auftreten der Ausnahme ausgeführt, bevor andere Ausnahmebehandlungsroutinen zum Einsatz kommen. Die Befehlszeichenfolge kann mit einem Ausführungsbefehl wie g (Go), gh (Mit Ausnahme behandelt) oder gn (Mit Ausnahme nicht behandelt) enden.
Ereignisdefinitionen und Standardwerte
Sie können den Unterbrechungsstatus oder den Behandlungsstatus der folgenden Ausnahmen ändern. Der standardmäßige Pausenstatus wird angezeigt.
Der Standardbehandlungsstatus der folgenden Ausnahmen lautet immer "Nicht verarbeitet". Seien Sie vorsichtig damit, diesen Status zu ändern. Wenn Sie diesen Status in "Handled" ändern, werden alle Ausnahmen des Typs "First-Chance" und "Second-Chance" als behandelt betrachtet, und diese Konfiguration umgeht alle Ausnahmebehandlungsroutinen.
| Ereigniscode | Bedeutung | Standardunterbrechungsstatus |
|---|---|---|
asrt |
Assertionsfehler |
Brechen |
av |
Zugriffsverletzung |
Brechen |
dm |
Falsch ausgerichtete Daten |
Brechen |
dz |
Ganzzahlige Division durch Null |
Brechen |
c000008e |
Gleitkommateilung um Null |
Brechen |
oder |
C++-EH-Ausnahme |
Zweite-Chance-Pause |
Allgemeinmediziner |
Schutzseitenverletzung |
Brechen |
ii |
Unzulässige Anweisung |
Zweite-Chance-Pause |
iov |
Ganzzahliger Überlauf |
Brechen |
ip- |
In-Page-E/A-Fehler |
Brechen |
Isc |
Ungültiger Systemaufruf |
Brechen |
lsq |
Ungültige Sperrsequenz |
Brechen |
sbo |
Stapelpufferüberlauf |
Brechen |
Sov |
Stapelüberlauf |
Brechen |
wkd |
Aufweck-Debugger |
Brechen |
Aph |
Anwendungsaufhänger Diese Ausnahme wird ausgelöst, wenn das Windows-Betriebssystem zu dem Schluss kommt, dass ein Prozess nicht mehr reagiert (d. h. nicht mehr reagiert). |
Brechen |
3c |
Kündigung des Kinderantrags |
Zweite-Chance-Pause |
ch |
Ungültiger Handle |
Brechen |
Number |
Eine nummerierte Ausnahme |
Zweite-Chance-Pause |
Anmerkung Sie können den Asrt-Unterbrechungsstatus für eine bestimmte Adresse überschreiben, indem Sie den Befehl ah (Assertion Handling) verwenden. Die Ch - und hc-Ereigniscodes beziehen sich auf dieselbe Ausnahme. Wenn Sie den Unterbrechungsstatus steuern, verwenden Sie sx* ch. Wenn Sie den Bearbeitungsstatus steuern, verwenden Sie sx* hc.
Sie können den Unterbrechungsstatus oder den Behandlungsstatus der folgenden Ausnahmen ändern. Der Standard-Pause-Status ist angegeben.
Der Standardbehandlungsstatus der folgenden Ausnahmen ist immer "Handled". Da diese Ausnahmen für die Kommunikation mit dem Debugger verwendet werden, sollten Sie den Status in der Regel nicht in "Nicht behandelt" ändern. Dieser Status bewirkt, dass andere Ausnahmehandler die Ausnahmen abfangen, wenn der Debugger sie ignoriert.
Eine Anwendung kann DBG_COMMAND_EXCEPTION (dbce) verwenden, um mit dem Debugger zu kommunizieren. Diese Ausnahme ähnelt einem Haltepunkt, Sie können jedoch den SX*-Befehl verwenden, um auf eine bestimmte Weise zu reagieren, wenn diese Ausnahme auftritt.
| Ereigniscode | Bedeutung | Standardunterbrechungsstatus |
|---|---|---|
dbce |
Spezifische Debuggerbefehl-Ausnahme |
Ignorieren |
vcpp |
Spezielle Visual C++-Ausnahme |
Ignorieren |
Wos |
WOW64 Einzelschritt-Ausnahme |
Brechen |
Wob |
WOW64 Haltepunkt-Ausnahme |
Brechen |
Sse |
Einzelschritt-Ausnahme |
Brechen |
bpe |
Haltepunkt-Ausnahme |
Brechen |
cce |
STRG+C oder STRG+UMBRUCH Diese Ausnahme wird ausgelöst, wenn das Ziel eine Konsolenanwendung ist und STRG+C oder STRG+BREAK an sie übergeben wird. |
Brechen |
Anmerkung Die letzten drei Ausnahmen in der vorherigen Tabelle weisen zwei unterschiedliche Ereigniscodes auf. Wenn Sie den Unterbrechungsstatus steuern, verwenden Sie sse, bpe und cce. Wenn Sie den Bearbeitungsstatus steuern, verwenden Sie ssec, bpec und cc.
Die folgenden Ausnahmen sind hilfreich, wenn Sie verwalteten Code debuggen.
| Ereigniscode | Bedeutung | Standardstatus |
|---|---|---|
clr |
Common Language Runtime-Ausnahme |
Zweite Chance-Abbruch Nicht behandelt |
clrn |
Ausnahme für common Language Runtime-Benachrichtigungen |
Zweite Chance-Pause Verarbeitete |
Sie können den Unterbrechungsstatus der folgenden Ereignisse ändern. Da diese Ereignisse keine Ausnahmen sind, ist ihr Behandlungsstatus irrelevant.
| Ereigniscode | Bedeutung | Standardunterbrechungsstatus |
|---|---|---|
Ser |
Systemfehler |
Ignorieren |
cpr[:Prozess] |
Prozesserstellung Das Festlegen des Unterbrechungsstatus dieses Ereignisses gilt nur für das Debuggen im Benutzermodus. Dieses Ereignis tritt nicht im Kernelmodus auf. Sie können dieses Ereignis nur steuern, wenn Sie das Debuggen untergeordneter Prozesse in CDB oder WinDbg aktiviert haben, entweder über dieBefehlszeilenoption "-o" oder über den Befehl ".childdbg" (Debug Child Processes). Der Prozessname kann eine optionale Dateinamenerweiterung und ein Sternchen () oder Fragezeichen (?) als Wildcardzeichen enthalten. Der Debugger merkt sich nur die letzte Cpr-Einstellung . Separate Einstellungen für separate Prozesse werden nicht unterstützt. Schließen Sie einen Doppelpunkt oder ein Leerzeichen zwischen Cpr und Process ein. Wenn "Prozess " nicht angegeben wird, gilt die Einstellung für alle untergeordneten Prozesserstellungen. |
Ignorieren |
epr[:Process] |
Prozessbeendigung Das Festlegen des Unterbrechungsstatus dieses Ereignisses gilt nur für das Debuggen im Benutzermodus. Dieses Ereignis tritt nicht im Kernelmodus auf. Sie können dieses Ereignis nur steuern, wenn Sie das Debuggen untergeordneter Prozesse in CDB oder WinDbg aktiviert haben, entweder über dieBefehlszeilenoption "-o" oder über den Befehl ".childdbg" (Debug Child Processes). Der Prozessname kann eine optionale Dateinamenerweiterung und ein Sternchen () oder Fragezeichen (?) als Wildcardzeichen enthalten. Der Debugger merkt sich nur die letzte Epr-Einstellung . Separate Einstellungen für separate Prozesse werden nicht unterstützt. Fügen Sie einen Doppelpunkt oder ein Leerzeichen zwischen Epr und Prozess ein. Wenn "Prozess " nicht angegeben wird, gilt die Einstellung für alle untergeordneten Prozessausgänge. |
Ignorieren |
Ct |
Threaderstellung |
Ignorieren |
Et |
Threadausgang |
Ignorieren |
ld[:Module] |
Modul laden Wenn Sie Modul angeben, wird der Haltepunkt gesetzt, wenn das Modul mit diesem Namen geladen wird. Modul kann den Namen oder die Adresse des Moduls angeben. Wenn der Name verwendet wird, enthält Modul möglicherweise eine Vielzahl von Wildcardzeichen und Bezeichnern. (Weitere Informationen zur Syntax finden Sie unter String Wildcard Syntax.) Der Debugger merkt sich nur die letzte ld-Einstellung. Separate Einstellungen für separate Module werden nicht unterstützt. Schließen Sie einen Doppelpunkt oder ein Leerzeichen zwischen ld und Module ein. Wenn Das Modul nicht angegeben wird, wird das Ereignis ausgelöst, wenn ein Modul geladen wird. |
Output |
ud[:Module] |
Entladen des Moduls Wenn Sie Modul angeben, tritt die Unterbrechung auf, wenn das Modul mit diesem Namen oder unter dieser Basisadresse entladen wird. Modul kann den Namen oder die Adresse des Moduls angeben. Wenn der Name verwendet wird, kann Modul ein exakter Name sein oder Wildcardzeichen enthalten. Wenn Modul ein exakter Name ist, wird es sofort mithilfe der aktuellen Debuggermodulliste in eine Basisadresse aufgelöst und als Adresse gespeichert. Wenn das Modul Wildcardzeichen enthält, wird die Musterzeichenfolge für einen späteren Abgleich bei Entladeereignissen beibehalten. Selten enthält der Debugger keine Namensinformationen für Unload-Ereignisse und vergleicht nur anhand der Basisadresse. Wenn Module also Wildcardzeichen enthält, kann der Debugger in diesem speziellen Fall des Entladens keine Namensentsprechung ausführen und wird unterbrochen, wenn ein Modul entladen wird. Der Debugger merkt sich nur die letzte Ud-Einstellung . Separate Einstellungen für separate Module werden nicht unterstützt. Schließen Sie einen Doppelpunkt oder ein Leerzeichen zwischen ud und Module ein. Wenn Das Modul nicht angegeben wird, wird das Ereignis ausgelöst, wenn ein Modul geladen wird. |
Output |
out[:Ausgabe] |
Ausgabe der Zielanwendung Wenn Sie Output angeben, tritt die Unterbrechung nur auf, wenn die Ausgabe, die dem angegebenen Muster entspricht, empfangen wird. Die Ausgabe kann eine Vielzahl von Wildcard-Zeichen und Spezifizierern enthalten. (Weitere Informationen zur Syntax finden Sie unter String Wildcard Syntax.) Die Ausgabe darf jedoch keinen Doppelpunkt oder Leerzeichen enthalten. Bei der Übereinstimmung wird die Groß-/Kleinschreibung nicht beachtet. Fügen Sie einen Doppelpunkt oder ein Leerzeichen zwischen Output und Ausgabe ein. |
Ignorieren |
ibp |
Erster Haltepunkt (Dieses Ereignis tritt am Anfang der Debugsitzung und nach dem Neustart des Zielcomputers auf.) |
Im Benutzermodus: Unterbrechung. Sie können diesen Status mithilfe der Befehlszeilenoption-g in "Ignorieren" ändern. Im Kernelmodus: Ignorieren. Sie können diesen Status durch eine Vielzahl von Methoden in "Aktiviert" ändern. Weitere Informationen zum Ändern dieses Status finden Sie unter Abstürzen und Neustarten des Zielcomputers. |
iml |
Anfängliches Modulladeprogramm (Nur Kernelmodus) |
Ignorieren: Sie können diesen Status auf "Pause" durch verschiedene Methoden ändern. Weitere Informationen zum Ändern dieses Status finden Sie unter Abstürzen und Neustarten des Zielcomputers. |