ba (Unterbrechung bei Zugriff)
Der Befehl ba legt einen Prozessor-Haltepunkt fest (häufig, weniger genau, als Daten-Haltepunkt bezeichnet). Dieser Haltepunkt wird ausgelöst, wenn auf den angegebenen Speicher zugegriffen wird.
Benutzermodus
[~Thread] ba[ID] Access Size [Options] [Address [Passes]] ["CommandString"]
Kernelmodus
ba[ID] Access Size [Options] [Address [Passes]] ["CommandString"]
Parameter
Faden
Gibt den Thread an, auf den der Haltepunkt angewendet wird. Weitere Informationen zur Syntax finden Sie unter Thread Syntax. Sie können Threads nur im Benutzermodus angeben.
ID
Gibt eine optionale Zahl an, die den Haltepunkt identifiziert. Wenn Sie keine ID angeben, wird die erste verfügbare Haltepunktnummer verwendet. Leerzeichen zwischen ba und der ID-Nummer können nicht hinzugefügt werden. Jeder Prozessor unterstützt nur eine begrenzte Anzahl von Prozessorunterbrechungspunkten, aber es gibt keine Einschränkung für den Wert der ID-Nummer . Wenn Sie die ID in eckige Klammern ([]) einschließen, kann die ID einen beliebigen Ausdruck enthalten. Weitere Informationen zur Syntax finden Sie unter Numerische Ausdruckssyntax.
Zugang
Gibt den Zugriffstyp an, der dem Haltepunkt entspricht. Dieser Parameter kann einen der folgenden Werte annehmen.
Option | Aktion |
---|---|
e (ausführen) |
Wechselt in den Debugger, wenn die CPU eine Anweisung aus der angegebenen Adresse abruft. |
r (lesen/schreiben) |
Wechselt in den Debugger, wenn die CPU an der angegebenen Adresse liest oder schreibt. |
w (schreiben) |
Unterbricht den Debugger, wenn die CPU an der angegebenen Adresse schreibt. |
i (i/o) |
(Nur Kernelmodus, x86-basierte Systeme) Wechselt in den Debugger, wenn auf den E/A-Port an der angegebenen Adresse zugegriffen wird. |
Größe
Gibt die Größe des Speicherorts in Byte an, der für den Zugriff überwacht werden soll. Bei einem x86-basierten Prozessor kann dieser Parameter 1, 2 oder 4 sein. Wenn jedoch Zugriff gleich e ist, muss Größe 1 sein.
Bei einem x64-basierten Prozessor kann dieser Parameter 1, 2, 4 oder 8 sein. Wenn jedoch Zugriff gleich e ist, muss Größe 1 sein.
Optionen Gibt die Haltepunktoptionen an. Sie können eine beliebige Anzahl der folgenden Optionen verwenden, mit Ausnahme der angegebenen:
/1
Erstellt einen "einmaligen" Haltepunkt. Nachdem dieser Haltepunkt ausgelöst wurde, wird der Haltepunkt endgültig aus der Haltepunktliste entfernt.
/p EProcess
(Nur Kernelmodus) Gibt einen Prozess an, der diesem Haltepunkt zugeordnet ist. EProcess sollte die tatsächliche Adresse der EPROCESS-Struktur sein, nicht die PID. Der Haltepunkt wird nur ausgelöst, wenn er im Kontext dieses Prozesses auftritt.
/t EThread
(Nur Kernelmodus) Gibt einen Thread an, der diesem Haltepunkt zugeordnet ist. EThread sollte die tatsächliche Adresse der ETHREAD-Struktur sein, nicht die Thread-ID. Der Haltepunkt wird nur ausgelöst, wenn er im Kontext dieses Threads auftritt. Wenn Sie /p EProcess und /t EThread verwenden, können Sie diese in einer der beiden Reihenfolge eingeben.
/c MaxCallStackDepth
Bewirkt, dass der Haltepunkt nur aktiv ist, wenn die Aufrufstapeltiefe kleiner als MaxCallStackDepth ist. Sie können diese Option nicht mit /C kombinieren.
/C MinCallStackDepth
Bewirkt, dass der Haltepunkt nur aktiv ist, wenn die Aufrufstapeltiefe größer als MinCallStackDepth ist. Sie können diese Option nicht mit /c kombinieren.
/w dx-Objektausdruck Legt einen bedingten Haltepunkt basierend auf dem booleschen Wert fest, der von dx-Objektausdruck zurückgegeben wird. Bei dem Argument handelt es sich um einen Datenmodellausdruck (dx), der als wahr ausgewertet wird (Übereinstimmungsbedingung – Umbruch) oder falsch (nicht mit der Bedingung übereinstimmt – nicht umbrechen).
In diesem Beispiel wird ein bedingter Haltepunkt basierend auf dem Wert von globalVariable festgelegt. Auf diese Weise kann ein Zugriffshaltepunkt beispielsweise den Wert überprüfen, der geschrieben wurde, wenn ermittelt wird, ob der Debugger umgebrochen werden soll.
ba w 4 /w "mymodule!globalVariable == 4" mymodule!globalVariable
In diesem Beispiel wird gezeigt, wie Sie einen Haltepunkt mit JavaScript festlegen.
ba w 4 /w "@$scriptContents.myFunc(mymodule!globalVariable)" mymodule!globalVariable
Weitere Informationen zu Debuggerobjekten finden Sie unter dx (Debugger-Objektmodellausdruck anzeigen).
Weitere Informationen zu bedingten Haltepunkten finden Sie unter Festlegen eines bedingten Haltepunkts.
Adresse
Gibt jede gültige Adresse an. Wenn die Anwendung auf den Speicher an dieser Adresse zugreift, beendet der Debugger die Ausführung und zeigt die aktuellen Werte aller Register und Flags an. Diese Adresse muss ein Offset sein und entsprechend ausgerichtet sein, um dem Parameter Size zu entsprechen. (Beispiel: Wenn Größe 4 ist, mussAdresse ein Vielfaches von 4 sein.) Wenn Sie Adresse weglassen, wird der aktuelle Anweisungszeiger verwendet. Weitere Informationen zur Syntax finden Sie unter Adress- und Adressbereichssyntax.
Pässe
Gibt an, wie oft der Haltepunkt übergeben wird, bis er aktiviert wird. Diese Zahl kann ein beliebiger 16-Bit-Wert sein. Die Häufigkeit, mit der der Programmzähler diesen Punkt durchläuft, ohne zu brechen, ist ein Wert kleiner als der Wert dieser Zahl. Daher entspricht das Weglassen dieser Zahl dem Festlegen auf 1. Beachten Sie auch, dass diese Zahl nur die Male zählt, die die Anwendung nach diesem Punkt ausführt . Das Durchlaufen oder Nachverfolgen über diesen Punkt wird nicht gezählt. Nachdem die vollständige Anzahl erreicht wurde, können Sie diese Nummer nur zurücksetzen, indem Sie den Haltepunkt löschen und zurücksetzen.
CommandString
Gibt eine Liste von Befehlen an, die jedes Mal ausgeführt werden sollen, wenn der Haltepunkt die angegebene Anzahl von Malen gefunden wird. Diese Befehle werden nur ausgeführt, wenn der Haltepunkt erreicht wird, nachdem Sie einen g (Go)Befehl anstelle eines t (Nachverfolgen) oder p (Schritt)-Befehl ausführen. Debuggerbefehle in CommandString können Parameter enthalten.
Sie müssen diese Befehlszeichenfolge in Anführungszeichen setzen und mehrere Befehle durch Semikolons trennen. Sie können standardmäßige C-Steuerzeichen (z . B. \n und \") verwenden. Semikolons, die in Anführungszeichen der zweiten Ebene (\") enthalten sind, werden als Teil der eingebetteten Zeichenfolge interpretiert.
Dieser Parameter ist optional.
Environment
Element | Beschreibung |
---|---|
Modi | Benutzermodus, Kernelmodus |
Targets | Nur Livedebugging |
Plattformen | Alle |
Zusätzliche Informationen
Weitere Informationen zu Prozessorhaltepunkten finden Sie unter Prozessorhaltepunkte (ba-Haltepunkte). Weitere Informationen und Beispiele für die Verwendung von Haltepunkten, andere Haltepunktbefehle und Methoden zum Steuern von Haltepunkten sowie Informationen zum Festlegen von Haltepunkten im Benutzerbereich aus einem Kerneldebugger finden Sie unter Verwenden von Haltepunkten. Weitere Informationen zu bedingten Haltepunkten finden Sie unter Festlegen eines bedingten Haltepunkts.
Hinweise
Der Debugger verwendet die ID-Nummer, um auf den Haltepunkt mit den Befehlen bc (Haltepunkt löschen), bd (Haltepunk deaktivieren) und be (Haltepunkt aktivieren) später zurückzukommen.
Verwenden Sie den Befehl bl (Haltepunktliste), um alle vorhandenen Haltepunkte, deren ID-Nummern und ihren Status aufzulisten.
Verwenden Sie den Befehl .bpcmds (Haltepunktbefehle anzeigen), um alle vorhandenen Haltepunkte, deren ID-Nummern und die Befehle aufzulisten, mit denen sie erstellt wurden.
Jeder Prozessor-Haltepunkt hat eine Größe zugeordnet. Beispielsweise könnte ein W (Schreib-)Prozessor-Haltepunkt an der Adresse 0x70001008 mit einer Größe von vier Bytes festgelegt werden. Dadurch würde der Adressblock von 0x70001008 bis einschließlich 0x7000100B überwacht. Wenn dieser Speicherblock geschrieben wird, wird der Haltepunkt ausgelöst.
Es kann vorkommen, dass der Prozessor einen Vorgang für einen Speicherbereich ausführt, der sich mit dem angegebenen Bereich überlappt, aber nicht identisch mit dem angegebenen Bereich ist. In diesem Beispiel wäre ein einzelner Schreibvorgang, der den Bereich 0x70001000 zum 0x7000100F enthält, oder ein Schreibvorgang, der nur das Byte an 0x70001009 enthält, ein überlappender Vorgang. In einer solchen Situation ist, ob der Haltepunkt ausgelöst wird, prozessorabhängig. Weitere Informationen finden Sie im Prozessorhandbuch. Um eine bestimmte Instanz zu verwenden, wird auf einem x86-Prozessor ein Lese- oder Schreibhaltepunkt ausgelöst, wenn der zugegriffene Bereich den Haltepunktbereich überlappt.
Wenn ein e (ausführen) Haltepunkt für die Adresse 0x00401003 festgelegt ist und dann eine Zwei-Byte-Anweisung über die Adressen 0x00401002 und 0x00401003 ausgeführt wird, ist das Ergebnis prozessorabhängig. Weitere Informationen finden Sie im Handbuch zur Prozessorarchitektur.
Der Prozessor unterscheidet zwischen Haltepunkten, die von einem Benutzermodusdebugger und Haltepunkten festgelegt werden, die von einem Kernelmodusdebugger festgelegt wurden. Ein Benutzermodusprozessor-Haltepunkt wirkt sich nicht auf Kernelmodusprozesse aus. Ein Kernelmodus-Prozessor-Haltepunkt kann einen Benutzermodusprozess beeinflussen oder auch nicht, abhängig davon, ob der Benutzermoduscode den Debug-Registerstatus verwendet und ob ein Benutzermodus-Debugger angehängt ist.
Verwenden Sie den Befehl .apply_dbp (Datentrennzeichen auf Kontext anwenden), um die vorhandenen Datentrennpunkte des aktuellen Prozesses auf einen anderen Registerkontext anzuwenden.
Auf einem Multiprozessorcomputer gilt jeder Prozessorunterbrechungspunkt für alle Prozessoren. Wenn der aktuelle Prozessor beispielsweise 3 ist und Sie den Befehl ba e1 MyAddress
verwenden, um einen Haltepunkt bei MyAddress zu platzieren, löst jeder Prozessor - nicht nur Prozessor 3 - die an dieser Adresse ausgeführt wird, den Haltepunkt aus. (Dies gilt auch für Software-Haltepunkte.)
Sie können nicht mehrere Prozessorunterbrechungen an derselben Adresse erstellen, die sich nur in ihren CommandString-Werten unterscheiden. Sie können jedoch mehrere Haltepunkte an derselben Adresse erstellen, die unterschiedliche Einschränkungen aufweisen (z. B. unterschiedliche Werte der Optionen /p, /t, /c und /C options).
Weitere Informationen zu Prozessor-Haltepunkten und zusätzlichen Einschränkungen, die für sie gelten, finden Sie unter Prozessor (ba-Haltepunkte).
Die folgenden Beispiele zeigen den ba-Befehl. Der folgende Befehl legt einen Haltepunkt für den Lesezugriff auf 4 Byte der Variablen myVar fest.
0:000> ba r4 myVar
Der folgende Befehl fügt einen Haltepunkt für alle seriellen Ports mit Adressen von 0x3F8 bis 0x3FB hinzu. Dieser Haltepunkt wird ausgelöst, wenn etwas gelesen oder in diese Ports geschrieben wird.
kd> ba i4 3f8