Interagieren mit der Engine

Befehle und Ausdrücke

Die Debugger-Engine-API stellt Methoden zum Ausführen von Befehlen und Auswerten von Ausdrücken bereit, z. B. solche, die im Debuggerbefehlsfenster von WinDbg eingegeben werden. Verwenden Sie Ausführen, um einen Debuggerbefehl auszuführen. Oder verwenden Sie ExecuteCommandFile, um alle Befehle in einer Datei auszuführen.

Die Methode Evaluate wertet Ausdrücke mithilfe der C++- oder MASM-Syntax aus. Die Syntax, die von der Debugger-Engine zum Auswerten von Ausdrücken verwendet wird, z. B. in der Evaluate-Methode , wird von GetExpressionSyntax angegeben und kann mithilfe von SetExpressionSyntaxByName und SetExpressionSyntax geändert werden. Die Anzahl der verschiedenen Syntaxen, die vom Debugger erkannt werden, wird von GetNumberExpressionSyntaxes zurückgegeben, und ihre Namen werden von GetExpressionSyntaxNames zurückgegeben.

Der Typ des Werts, der von Evaluate zurückgegeben wird, wird durch die Symbole und Konstanten bestimmt, die in der ausgewerteten Zeichenfolge verwendet werden. Der Wert ist in einer DEBUG_VALUE-Struktur enthalten und kann mithilfe von CoerceValue und CoerceValues in verschiedene Typen umgewandelt werden.

Aliase

Aliase sind Zeichenfolgen, die automatisch durch andere Zeichenfolgen ersetzt werden, wenn sie in Debuggerbefehlen und -ausdrücken verwendet werden. Eine Übersicht über Aliase finden Sie unter Verwenden von Aliasen. Die Debugger-Engine verfügt über mehrere Klassen von Aliasen.

Die Aliase mit festen Namen werden nach Nummer indiziert und weisen die Namen $u 0, $u 1, ..., $u 9 auf. Die Werte dieser Aliase können mithilfe der SetTextMacro-Methode festgelegt und mit der GetTextMacro-Methode abgerufen werden.

Die automatischen Aliase und benutzernamenten Aliase können einen beliebigen Namen haben. Die automatischen Aliase werden von der Debugger-Engine definiert, und die benutzerdefinierten Aliase werden vom Benutzer über Debuggerbefehle oder die Debugger-Engine-API definiert. Verwenden Sie die SetTextReplacement-Methode , um einen Alias mit Benutzernamen zu definieren oder zu entfernen. Die GetTextReplacement-Methode gibt den Namen und den Wert eines automatischen Alias oder eines Benutzeralias zurück. Alle benutzerdefinierten Aliase können mithilfe der RemoveTextReplacements-Methode entfernt werden. Die GetNumberTextReplacements-Methode gibt die Anzahl von Benutzernamen und automatischen Aliasen zurück. dies kann mit GetTextReplacement verwendet werden, um alle diese Aliase zu durchlaufen. Die OutputTextReplacements-Methode gibt eine Liste aller benutzerdefinierten Aliase aus, einschließlich ihrer Namen und Werte.

Beachten Sie , wenn ein Benutzername-Alias den gleichen Namen wie ein automatischer Alias erhält, der benannte Benutzeralias den automatischen Alias ausblendet, sodass beim Abrufen des Werts des Alias anhand des Namens der benutzerdefinierte Alias verwendet wird.

>Engine-Optionen

Die Engine verfügt über eine Reihe von Optionen, die ihr Verhalten steuern. Diese Optionen sind in DEBUG_ENGOPT_XXX aufgeführt. Sie werden von GetEngineOptions zurückgegeben und können mithilfe von SetEngineOptions festgelegt werden. Einzelne Optionen können mithilfe von AddEngineOptions festgelegt und mit RemoveEngineOptions deaktiviert werden.

Interrupts

Ein Interrupt ist eine Möglichkeit, eine Unterbrechung im Debugger zu erzwingen oder die Engine anweisen, die Verarbeitung des aktuellen Befehls zu beenden, z. B. durch Drücken von STRG+Break in WinDbg.

Verwenden Sie SetInterrupt, um eine Unterbrechung des Debuggers anzufordern oder die aktuelle Aufgabe des Debuggers zu unterbrechen. Verwenden Sie GetInterrupt, um zu überprüfen, ob ein Interrupt aufgetreten ist.

Hinweis Wenn eine lange Aufgabe über eine Debuggererweiterung ausgeführt wird, wird empfohlen, dass die Erweiterung GetInterrupt regelmäßig überprüft und die Verarbeitung beendet, wenn ein Interrupt angefordert wurde.

Beim Anfordern einer Unterbrechung des Debuggers kann für die Engine ein Timeout auftreten, wenn es zu lange dauert, bis das Ziel den Einbruch durchführt. Dies kann auftreten, wenn sich das Ziel in einem nicht reaktionsfähigen Zustand befindet oder wenn die Einbruchanforderung durch Ressourcenkonflikte blockiert oder verzögert wird. Die Dauer der Wartezeit durch die Engine wird von GetInterruptTimeout zurückgegeben und kann mithilfe von SetInterruptTimeout festgelegt werden.