Ausführen, bis ein angegebener Zustand erreicht ist
Es gibt mehrere Möglichkeiten, das Ziel auszuführen, bis ein angegebener Zustand erreicht ist.
Verwenden eines Haltepunkts zum Steuern der Ausführung
Eine Methode besteht darin, einen Haltepunkt zu verwenden. Der einfachste Haltepunkt stoppt die Ausführung, wenn der Programmindikator eine angegebene Adresse erreicht. Ein komplexerer Haltepunkt kann Folgendes ausführen:
nur ausgelöst werden, wenn diese Adresse von einem bestimmten Thread ausgeführt wird,
eine angegebene Anzahl von Durchläufen durch diese Adresse zulassen, bevor sie ausgelöst werden,
automatisch einen angegebenen Befehl aus, wenn er ausgelöst wird, oder
watch eine angegebene Adresse im nicht ausführbaren Arbeitsspeicher und wird ausgelöst, wenn dieser Speicher gelesen oder in diesen geschrieben wird.
Ausführliche Informationen zum Festlegen und Steuern von Haltepunkten finden Sie unter Verwenden von Haltepunkten.
Eine kompliziertere Methode zum Ausführen, bis ein angegebener Zustand erreicht ist, ist die Verwendung eines bedingten Haltepunkts. Diese Art von Haltepunkt wird an einer bestimmten Adresse festgelegt, wird aber nur ausgelöst, wenn eine angegebene Bedingung vorhanden ist. Ausführliche Informationen finden Sie unter Festlegen eines bedingten Haltepunkts.
Haltepunkte und Pseudo-Registers
Bei der Angabe des gewünschten Zustands ist es häufig hilfreich, automatische Pseudoregister zu verwenden. Dabei handelt es sich um Variablen, die vom Debugger gesteuert werden, mit denen Sie auf eine Vielzahl von Werten verweisen können, die sich auf den Zielzustand beziehen.
Der folgende Haltepunkt verwendet beispielsweise das $thread Pseudoregister, das immer dem Wert des aktuellen Threads entspricht. Es wird in den Wert des aktuellen Threads aufgelöst, wenn er in einem Befehl verwendet wird. Wenn Sie $thread als Argument des / t-Parameters des Befehls bp (Set Breakpoint) verwenden, können Sie einen Haltepunkt erstellen, der jedes Mal ausgelöst wird, wenn NtOpenFile von dem Thread aufgerufen wird, der zum Zeitpunkt der Ausgabe des bp-Befehls aktiv war:
kd> bp /t @$thread nt!ntopenfile
Dieser Haltepunkt wird nicht ausgelöst, wenn ein anderer Thread NtOpenFile aufruft.
Eine Liste der automatischen Pseudoregister finden Sie unter Pseudoregistersyntax.
Verwenden einer Skriptdatei zum Steuern der Ausführung
Eine andere Möglichkeit zum Ausführen, bis ein festgelegter Zustand erreicht ist, besteht darin, eine Skriptdatei zu erstellen, die sich rekursiv aufruft und dabei den gewünschten Zustand in jeder Iteration testet.
In der Regel enthält diese Skriptdatei die Token ".if " und ".else" . Sie können einen Befehl wie t (Ablaufverfolgung) verwenden, um einen einzelnen Schritt auszuführen und dann die betreffende Bedingung zu testen.
Wenn Sie beispielsweise ausführen möchten, bis das eax-Register den Wert 0x1234 enthält, können Sie eine Skriptdatei namens eaxstep erstellen, die die folgende Zeile enthält:
.if (@eax == 1234) { .echo 1234 } .else { t "$<eaxstep" }
Geben Sie dann den folgenden Befehl aus dem Debuggerbefehlsfenster aus:
t "$<eaxstep"
Dieser t-Befehl führt einen einzelnen Schritt aus und führt dann den Befehl in Anführungszeichen aus. Bei diesem Befehl handelt es sich um $< (Skriptdatei ausführen), wodurch die eaxstep-Datei ausgeführt wird. Die Skriptdatei testet den Wert von eax, führt den t-Befehl aus und ruft sich dann rekursiv auf. Dies wird fortgesetzt, bis das eax-Register 0x1234 entspricht. An diesem Punkt gibt der Befehl ECHO (Echokommentar) eine Nachricht an das Debuggerbefehlsfenster aus, und die Ausführung wird beendet.
Ausführliche Informationen zu Skriptdateien finden Sie unter Verwenden von Skriptdateien und Verwenden von Debuggerbefehlsprogrammen.
Mehrdeutige Breakpointauflösung
In Version 10.0.25310.1001 und höher der Debugger-Engine wird jetzt eine mehrdeutige Breakpointauflösung unterstützt. Mehrdeutige Haltepunkte ermöglichen es dem Debugger, Haltepunkte in bestimmten Szenarien festzulegen, in denen ein Breakpointausdruck an mehrere Speicherorte aufgelöst wird. Weitere Informationen finden Sie unter Mehrdeutige Breakpointauflösung.
Siehe auch
bp, bu, bm (Breakpoint festlegen)