Steuern eines Programms während des Debuggings
Während des Debuggens besteht das Steuern eines Programms darin, Haltepunkte im verwalteten Code festzulegen, verwalteten und nicht verwalteten Code schrittweise auszuführen und Ausnahmen der ersten und der zweiten Chance zu behandeln. In den folgenden Abschnitten wird beschrieben, wie ein Debugger die Common Runtime Language (CLR) beim Debuggen einer API zur Durchführung dieser Aufgaben einsetzt.
Festlegen eines Haltepunkts in verwaltetem Code
Die folgende Liste enthält eine schrittweise Beschreibung des Festlegens eines Haltepunkts in verwaltetem Code:
Der Debugger erhält ein Modulobjekt für die gegebene Funktion. Der Debugger ruft die Methode ICorDebugAppDomain::GetModuleFromMetaDataInterface mit der Metadaten-Schnittstelle auf, um ein ICorDebugModule-Objekt für die Funktion des Moduls zu erhalten.
Der Debugger erhält ein Funktionsobjekt für die gegebene Funktion, indem er die ICorDebugModule::GetFunctionFromToken-Methode aufruft.
Der Debugger erhält das Codeobjekt für die gegebene Funktion, indem er die ICorDebugFunction::GetILCode-Methode aufruft.
Der Debugger erstellt einen Haltepunkt im verwalteten Code, indem er die ICorDebugCode::CreateBreakpoint-Methode mit einem bestimmten Offset aufruft. CreateBreakpoint gibt eine ICorDebugBreakpoint-Instanz zurück. Der Haltepunkt wird im aktiven Zustand erstellt.
Der Debugger setzt die Ausführung des Prozesses fort, indem er die ICorDebugController::Continue-Methode für den Prozess aufruft, für den das Debuggen durchgeführt werden soll.
Die Debug-API benachrichtigt den Debugger, wenn ein Thread den Haltepunkt erreicht, indem er den ICorDebugManagedCallback::Breakpoint-Rückruf aufruft.
Schrittweises Durchlaufen von verwaltetem und nicht verwaltetem Code
Die folgende Liste enthält eine schrittweise Beschreibung der einzelnen Schritte des Debuggers beim Durchlaufen des verwalteten Codes.
Der Debugger erstellt einen Stepper unter Berücksichtigung des Threads, in dem der Einzelschritt ausgeführt werden soll. Der Debugger ruft die ICorDebugThread::CreateStepper-Methode für den Thread auf, der schrittweise durchlaufen wird. Alternativ dazu kann der Debugger die ICorDebugFrame::CreateStepper-Methode für denjenigen Frame aufrufen, in Bezug auf den das schrittweise Durchlaufen ausgeführt werden soll. Es wird davon ausgegangen, dass der Prozess beendet wird, wenn der Stepper erstellt ist.
Der Debugger durchläuft den Thread, indem er die ICorDebugStepper::Step-Methode aufruft.
Der Debugger setzt die Ausführung des Prozesses fort, indem er die ICorDebugController::Continue-Methode für den Prozess aufruft, für den das Debuggen durchgeführt werden soll.
Die Debug-API informiert den Debugger, dass der Schritt abgeschlossen ist. Die Debug-API ruft die ICorDebugManagedCallback::StepComplete-Methode für das Objekt auf, bei dem sich der Debugger mit der Laufzeit registriert hat.
Der Debugger durchläuft den Thread erneut, indem er die ICorDebugStepper::Step-Methode aufruft.
Der Debugger setzt die Ausführung des Prozesses fort, indem er die ICorDebugController::Continue-Methode für den Prozess aufruft, für den das Debuggen durchgeführt werden soll.
Die folgende Liste beschreibt Alternativen für das schrittweise Durchlaufen bei nicht verwaltetem Code:
Der Debugger überspringt optional das schrittweise Durchlaufen in systemeigenen Code. Der Debugger ruft die ICorDebugStepper::StepOut-Methode auf, um das schrittweise Durchlaufen in systemeigenen Code zu überspringen, bis der vorherige Frame reaktiviert wird. Die Debug-API ruft die ICorDebugManagedCallback::StepComplete-Methode auf, wenn wieder verwalteter Code vorhanden ist.
Der Debugger durchläuft optional den nächsten Abschnitt von verwaltetem Code in Einzelschritten. Der Debugger ruft die ICorDebugStepper::Step-Methode auf, sodass die Steuerung wieder an den Debugger übergeht, sobald der vorherige verwaltete Frame wieder geöffnet wird oder wenn der nicht verwaltete Code neuen verwalteten Code aufruft.
Der Debugger setzt die Ausführung des Prozesses fort, indem er die ICorDebugController::Continue-Methode für den Prozess aufruft, für den das Debuggen durchgeführt werden soll.
Die Debug-API informiert den Debugger darüber, dass sie nicht verwalteten Code in Einzelschritten durchläuft, indem sie die ICorDebugUnmanagedCallback::DebugEvent-Methode aufruft.
Behandeln von Ausnahmen
Die folgende Liste enthält eine schrittweise Beschreibung der Behandlung von Ausnahmen der ersten Chance und der zweiten Chance:
Die CLR informiert den Debugger, dass eine Ausnahme der ersten Chance aufgetreten ist. Die Debug-API ruft die ICorDebugManagedCallback::Exception-Methode in der ICorDebugManagedCallback-Schnittstelle auf, bei der sich der Debugger mit der Laufzeit registriert hat.
Der Debugger ruft Informationen über die Ausnahme ab. Der Debugger ruft die ICorDebugThread::GetCurrentException-Methode für das ICorDebugThread-Objekt auf , an das er in dem Rückruf übergeben wurde, um ein Ausnahmeobjekt zu erhalten (ICorDebugValue).
Der Debugger erhält das ICorDebugObjectValue-Objekt für die Ausnahme. Der Debugger ruft die QueryInterface-Methode auf, um das ICorDebugObjectValue-Objekt für die Ausnahme zu erhalten.
Der Debugger erhält die Klasse des Ausnahmeobjekts, das durch den Aufruf der ICorDebugObjectValue::GetClass-Methode ausgelöst wurde.
Der Debugger entscheidet, die Ausnahme zu ignorieren, und setzt den Vorgang einfach fort.
Die CLR informiert den Debugger, dass eine Ausnahme der zweiten Chance aufgetreten ist. Die Debug-API ruft die ICorDebugManagedCallback::Exception-Methode auf und gibt an, dass die Ausnahme eine Ausnahme der zweiten Chance ist.
Der Benutzer entscheidet, dass die Ausnahme belanglos ist. Der Debugger ruft die ICorDebugThread::ClearCurrentException-Methode für den aktuell zu debuggenden Thread auf. Diese Methode löscht die Ausnahme und verhindert, dass die Ausnahme ausgelöst wird.
Der Debugger setzt die Ausführung des Prozesses fort, indem er die ICorDebugController::Continue-Methode für den Prozess aufruft, für den das Debuggen durchgeführt werden soll.
Siehe auch
Konzepte
Übersicht über das Debugging in der CLR