Freigeben über


Steuern von Ausnahmen und Ereignissen

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
hc

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
ssec

Einzelschritt-Ausnahme

Brechen

bpe
bpec

Haltepunkt-Ausnahme

Brechen

cce
cc

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.