Debugereignisse
Ein Debugereignis ist ein Incident im Prozess, der gedebuggt wird und dazu führt, dass das System den Debugger benachrichtigt. Debugereignisse umfassen das Erstellen eines Prozesses, das Erstellen eines Threads, das Laden einer Dll (Dynamic Link Library), das Entladen einer DLL, das Senden einer Ausgabezeichenfolge und das Generieren einer Ausnahme.
Wenn ein Debugereignis auftritt, während ein Debugger auf ein Ereignis wartet, füllt das System die durch WaitForDebugEvent angegebene DEBUG _ EVENT-Struktur mit Informationen zur Beschreibung des Ereignisses auf.
Wenn das System den Debugger über ein Debugereignis benachrichtigt, werden auch alle Threads im betroffenen Prozess angehalten. Die Ausführung der Threads wird erst fortgesetzt, wenn der Debugger das Debugereignis mit continueDebugEvent fortsetzt. Die folgenden Debugereignisse können während des Debuggens eines Prozesses auftreten.
| Debugereignis | Beschreibung |
|---|---|
| CREATE _ PROCESS _ _ DEBUG-EREIGNIS |
Wird immer dann generiert, wenn ein neuer Prozess in einem Prozess erstellt wird, der debuggt wird, oder wenn der Debugger mit dem Debuggen eines bereits aktiven Prozesses beginnt. Das System generiert dieses Debugereignis, bevor der Prozess im Benutzermodus und bevor das System andere Debugereignisse für den neuen Prozess generiert. Die DEBUG _ EVENT-Struktur enthält eine CREATE PROCESS DEBUG _ _ _ INFO-Struktur. Diese Struktur enthält ein Handle für den neuen Prozess, ein Handle für die Bilddatei des Prozesses, ein Handle für den anfänglichen Thread des Prozesses und andere Informationen, die den neuen Prozess beschreiben. Das Handle für den Prozess verfügt über PROCESS _ VM _ READ- und PROCESS _ VM _ WRITE-Zugriff. Wenn ein Debugger über diese Zugriffstypen für einen Thread verfügt, kann er mithilfe der Funktionen ReadProcessMemory und WriteProcessMemory Lese- und Schreibzugriff auf den Arbeitsspeicher des Prozesses ausführen. Wenn das System zuvor ein EXIT PROCESS DEBUG EVENT-Ereignis gemeldet hat, schließt das System dieses Handle, wenn der Debugger die _ _ _ ContinueDebugEvent-Funktion aufruft. Das Handle für die Imagedatei des Prozesses verfügt über generischen _ READ-Zugriff und wird für die Lesefreigabe geöffnet. Der Debugger sollte dieses Handle schließen, während CREATE _ PROCESS DEBUG EVENT verarbeitet _ _ wird. Das Handle für den anfänglichen Thread des Prozesses verfügt über THREAD _ GET _ CONTEXT-, THREAD SET CONTEXT- und _ THREAD SUSPEND _ _ _ RESUME-Zugriff auf den Thread. Wenn ein Debugger über diese Zugriffstypen für einen Thread verfügt, kann er mithilfe der Funktionen GetThreadContext und SetThreadContext aus den Registern des Threads lesen und in diese schreiben und den Thread mithilfe der Funktionen SuspendThread und ResumeThread fortsetzen. Wenn das System zuvor ein EXIT PROCESS DEBUG EVENT-Ereignis gemeldet hat, schließt das System dieses Handle, wenn der Debugger die _ _ _ ContinueDebugEvent-Funktion aufruft. |
| CREATE _ THREAD _ DEBUG _ EVENT |
Wird immer dann generiert, wenn ein neuer Thread in einem Prozess erstellt wird, der debuggt wird, oder wenn der Debugger mit dem Debuggen eines bereits aktiven Prozesses beginnt. Dieses Debugereignis wird generiert, bevor der neue Thread im Benutzermodus ausgeführt wird. Die DEBUG _ EVENT-Struktur enthält eine CREATE THREAD DEBUG _ _ _ INFO-Struktur. Diese Struktur enthält ein Handle für den neuen Thread und die Startadresse des Threads. Das Handle verfügt über THREAD _ GET _ CONTEXT-, THREAD _ SET _ CONTEXT- und THREAD SUSPEND _ _ RESUME-Zugriff auf den Thread. Wenn ein Debugger über diese Zugriffstypen für einen Thread verfügt, kann er mithilfe der Funktionen GetThreadContext und SetThreadContext aus den Registern des Threads lesen und in diese schreiben und den Thread mithilfe der Funktionen SuspendThread und ResumeThread fortsetzen. Wenn das System zuvor ein EXIT THREAD DEBUG EVENT-Ereignis gemeldet hat, schließt das System das Handle für den neuen Thread, wenn der Debugger die _ _ _ ContinueDebugEvent-Funktion aufruft. |
| _AUSNAHMEDEBUGEREIGNIS _ |
Wird immer dann generiert, wenn in dem Prozess, der debuggt wird, eine Ausnahme auftritt. Mögliche Ausnahmen sind der Versuch, auf nicht zugänglichen Speicher zu zugreifen, das Ausführen von Haltepunktanweisungen, das Aufteilen durch 0 (null) oder eine andere Ausnahme, die unter Structured Exception Handling (Strukturierte Ausnahmebehandlung) angegeben ist. Die DEBUG _ EVENT-Struktur enthält eine EXCEPTION DEBUG _ _ INFO-Struktur. Diese Struktur beschreibt die Ausnahme, die das Debugereignis verursacht hat. Neben den Standardausnahmebedingungen kann während des Debuggens des Konsolenprozesses ein zusätzlicher Ausnahmecode auftreten. Das System generiert einen DBG CONTROL C-Ausnahmecode, wenn STRG+C in einen Konsolenprozess eingegeben wird, der STRG+C-Signale verarbeitet und _ _ gedebuggt wird. Dieser Ausnahmecode ist nicht für die Handhabung durch Anwendungen gedacht. Eine Anwendung sollte niemals einen Ausnahmehandler verwenden, um sie zu behandeln. Sie wird nur zum Vorteil des Debuggers ausgelöst und nur verwendet, wenn ein Debugger an den Konsolenprozess angefügt ist. Wenn ein Prozess nicht gedebuggt wird oder der Debugger die DBG CONTROL C-Ausnahme nicht behandelt (über den gn-Befehl) übergibt, wird die Liste der Handlerfunktionen der Anwendung durchsucht, wie für die _ _ SetConsoleCtrlHandler-Funktion dokumentiert. Wenn der Debugger die DBG CONTROL C-Ausnahme (über den Gh-Befehl) behandelt, bemerkt eine Anwendung STRG+C nur in code _ _ wie diesem. while ((inputChar = getchar()) != EOF) ...Daher kann der Debugger nicht verwendet werden, um zu verhindern, dass der Lese-Warte-Prozess in diesem Code beendet wird. |
| EXIT _ PROCESS _ DEBUG _ EVENT |
Wird immer dann generiert, wenn der letzte Thread in einem Prozess, der debuggt wird, beendet wird. Dieses Debugereignis tritt unmittelbar auf, nachdem das System die DLLs des Prozesses entladen und den Exitcode des Prozesses aktualisiert hat. Die DEBUG _ EVENT-Struktur enthält eine EXIT PROCESS DEBUG _ _ _ INFO-Struktur, die den Exitcode angibt. Der Debugger gibt alle internen Strukturen, die dem Prozess zugeordnet sind, nach Eingang dieses Debugereignis wieder auf. Das System schließt das Handle des Debuggers für den beendenden Prozess und alle Threads des Prozesses. Der Debugger sollte diese Handles nicht schließen. Der Kernelmodusteil des Herunterfahrens des Prozesses kann erst abgeschlossen werden, wenn der Debugger, der dieses Ereignis empfängt, ContinueDebugEvent aufruft. Bis dahin sind die Prozesshandles geöffnet, und der virtuelle Adressraum wird nicht freigegeben, sodass der Debugger den untergeordneten Prozess untersuchen kann. Um eine Benachrichtigung zu erhalten, wenn der Kernelmodusteil des Herunterfahrens des Prozesses abgeschlossen ist, duplizieren Sie das mit CREATE PROCESS DEBUG EVENT zurückgegebene Handle, rufen _ _ Sie _ ContinueDebugEvent auf, und warten Sie dann, bis das duplizierte Prozesshand handle signalisiert wird. |
| EXIT _ THREAD _ DEBUG _ EVENT |
Wird immer dann generiert, wenn ein Thread, der Teil eines debuggten Prozesses ist, beendet wird. Das System generiert dieses Debugereignis unmittelbar nach dem Aktualisieren des Exitcodes des Threads. Die DEBUG _ EVENT-Struktur enthält eine EXIT THREAD DEBUG _ _ _ INFO-Struktur, die den Exitcode angibt. Dieses Debugereignis tritt nicht auf, wenn der beendende Thread der letzte Thread eines Prozesses ist. In diesem Fall tritt stattdessen das Debugereignis EXIT _ PROCESS _ DEBUG EVENT _ auf. Der Debugger gibt alle internen Strukturen, die dem Thread zugeordnet sind, nach Eingang dieses Debugereignis wieder auf. Das System schließt das Handle des Debuggers mit dem beendenden Thread. Der Debugger sollte dieses Handle nicht schließen. |
| LADEN DES _ _ DLL-DEBUG-EREIGNISSES _ |
Wird immer dann generiert, wenn ein Prozess, der debuggt wird, eine DLL lädt. Dieses Debugereignis tritt auf, wenn das Systemlader Links zu einer DLL auflöset oder wenn der debuggte Prozess die LoadLibrary-Funktion verwendet. Dieses Debugereignis tritt nur auf, wenn das System zum ersten Mal eine DLL an den virtuellen Adressraum eines Prozesses anfügen. Die DEBUG _ EVENT-Struktur enthält eine LOAD DLL DEBUG _ _ _ INFO-Struktur. Diese Struktur enthält ein Handle für die neu geladene DLL, die Basisadresse der DLL und andere Informationen, die die DLL beschreiben. Der Debugger sollte das Handle mit dem DLL-Handle schließen, während LOAD _ DLL DEBUG EVENT verarbeitet _ _ wird. In der Regel lädt ein Debugger eine Symboltabelle, die der DLL zugeordnet ist, wenn dieses Debugereignis angezeigt wird. |
| _ _ AUSGABEDEBUGZEICHENFOLGENEREIGNIS _ |
Wird generiert, wenn ein prozess, der debuggt wird, die OutputDebugString-Funktion. Die DEBUG _ EVENT-Struktur enthält eine OUTPUT DEBUG STRING _ _ _ INFO-Struktur. Diese Struktur gibt die Adresse, Länge und das Format der Debugzeichenfolge an. |
| DEBUGEREIGNIS _ "DLL _ _ ENTLADEN" |
Wird immer dann generiert, wenn ein Prozess, der debuggt wird, eine DLL mithilfe der FreeLibrary-Funktion entlädt. Dieses Debugereignis tritt nur auf, wenn eine DLL zuletzt aus dem Adressraum eines Prozesses entladen wird (d. h., wenn die Nutzungsanzahl der DLL 0 ist). Die DEBUG _ EVENT-Struktur enthält eine UNLOAD DLL DEBUG _ _ _ INFO-Struktur. Diese Struktur gibt die Basisadresse der DLL im Adressraum des Prozesses an, der die DLL entlädt. In der Regel entlädt ein Debugger eine Symboltabelle, die der DLL zugeordnet ist, wenn dieses Debugereignis empfangen wird. Wenn ein Prozess beendet wird, entlädt das System automatisch die DLLs des Prozesses, generiert jedoch kein UNLOAD _ DLL _ DEBUG _ EVENT-Debugereignis. |
| _RIP-EREIGNIS |
Wird immer dann generiert, wenn ein prozess, der debuggt wird, außerhalb des Steuerelements des Systemdebuggers abfälscht. Die DEBUG _ EVENT-Struktur enthält eine RIP _ INFO-Struktur. Diese Struktur gibt den Fehler und den Typ des Fehlers an. |