Überprüfen eines Programms während des Debuggings
Um ein Programm während des Debuggens zu überprüfen, muss der Debugger auf verwaltete Stapelrahmen zugreifen und Ausdrücke auswerten können. In den folgenden Abschnitten wird beschrieben, wie ein Debugger die Debug-API der Common Runtime Language (CLR) zur Durchführung dieser Aufgaben verwendet.
Zugreifen auf Aufruflisten
Die folgende Liste enthält eine Beschreibung der Schritte, die ein Debugger ausführen muss, um auf verwaltete Stapelrahmen zuzugreifen. Der zu debuggende Prozess muss für den Zugriff auf Stapelrahmen beendet werden.
Der Debugger ruft einen Enumerator für die Stapelketten ab. Der Debugger ruft die ICorDebugThread::EnumerateChains-Methode für den Thread auf, für den auf Stapelketten zugegriffen werden soll, um ein ICorDebugChainEnum-Objekt zur Auflistung der Stapelketten abzurufen.
Der Debugger durchläuft die Stapelketten, indem er die ICorDebugChainEnum::Next-Methode aufruft.
Der Debugger ruft einen Enumerator für die Stapelrahmen in der Kette ab, indem er die ICorDebugChain::EnumerateFrames-Methode aufruft.
Der Debugger durchläuft die Stapelrahmen weiter, indem er die ICorDebugFrameEnum::Next-Methode aufruft.
Der Debugger ruft ggf. die IP-Adresse ab. Der Debugger ruft die ICorDebugILFrame::GetIP-Methode auf, um die IP-Adresse abzurufen, die relativ zum Anfang der Funktion für den Stapelrahmen ist.
Der Debugger ruft ggf. weitere Informationen über den Stapelrahmen ab. Beispielsweise kann der Debugger die ICorDebugFrame::GetFunctionToken-Methode aufrufen, um das Metadatentoken der Funktion für den Code abzurufen, den der Stapelrahmen ausführt. Außerdem kann der Debugger die ICorDebugCode::GetCode-Methode aufrufen, um ein Objekt abzurufen, welches dem Code entspricht, den der Stapelrahmen ausführt.
Auswerten von Ausdrücken
Ausdrücke in nicht verwaltetem systemeigenem Code können mit den gleichen Mechanismen ausgewertet werden, die herkömmliche Debugger verwenden.
In verwaltetem Code kann der Debugger einen Ausdruck wie folgt auswerten:
Den Ausdruck analysieren.
Die Debug-API aufrufen, um auf die Werte von Variablen im Ausdruck zuzugreifen und die Funktionen im Ausdruck aufzurufen.
Alternativ kann der Debugger wie folgt vorgehen:
Den Ausdruck in einer globalen Funktion umschließen und die Funktion kompilieren.
Die Debug-API (Bearbeiten und Fortfahren) aufrufen, um die globale Funktion hinzuzufügen.
Die Debug-API aufrufen, um die Funktion auszuwerten.
Die folgende Liste enthält eine Beschreibung der Schritte, die ein Debugger ausführen muss, um einen Ausdruck auszuwerten. In diesem Szenario lautet der Ausdruck A + MyFunc(), wobei davon ausgegangen wird, dass sich A in einem Register befindet und es sich bei dem gedebuggten Code um verwalteten systemeigenen Code handelt.
Der Debugger ruft den Wert von A ab. Der Debugger ruft die ICorDebugNativeFrame::GetLocalRegisterValue-Methode für den Stapelrahmen auf, in dem der Ausdruck ausgewertet werden soll.
Der Debugger erstellt ein Auswertungsobjekt, indem er die ICorDebugThread::CreateEval-Methode für den Thread aufruft, in dem der Ausdruck ausgewertet werden soll.
Der Debugger berechnet den Wert von MyFunc(), indem er die ICorDebugEval::CallFunction-Methode aufruft.
Der Debugger wertet den Ausdruck aus. Der Debugger wendet eine Konstantenfaltung auf den Ausdruck an, indem er die in den beiden vorherigen Schritten abgerufenen Werte verwendet.
Siehe auch
Konzepte
Übersicht über das Debugging in der CLR