Freigeben über


Haltepunkte für Prozessoren (ba-Haltepunkte)

Haltepunkte, die auf Anforderung des Debuggers vom Prozessor gesteuert werden, sind als Prozessor-Haltepunkte oder Daten-Haltepunkte bekannt. Haltepunkte, die direkt vom Debugger gesteuert werden, werden als Software-Haltepunkte bezeichnet.

Hinweis Obwohl der Begriff Daten-Haltepunkt allgemein als Synonym für Prozessor-Haltepunkt verwendet wird, kann dieser Begriff irreführend sein. Es gibt zwei grundlegende Arten von Haltepunkten: Prozessor-Haltepunkte, die vom Prozessor gesteuert werden, und Software-Haltepunkte, die vom Debugger gesteuert werden. Prozessor-Haltepunkte werden in der Regel auf Programmdaten festgelegt – deshalb werden sie auch Daten-Haltepunkte genannt. Sie können aber auch auf ausführbaren Code festgelegt werden. Software-Haltepunkte werden in der Regel auf ausführbaren Code festgelegt, können aber auch auf Programmdaten festgelegt werden. Leider ist es in der Debugging-Literatur allgemein üblich, Prozessor-Haltepunkte als Daten-Haltepunkte zu bezeichnen, selbst wenn sie auf ausführbaren Code festgelegt sind.

Prozessor-Haltepunkte

Ein Prozessor-Haltepunkt wird ausgelöst, wenn auf eine bestimmte Speicherstelle zugegriffen wird. Es gibt vier Arten von Prozessor-Haltepunkten, entsprechend der Art des Speicherzugriffs, der ihn auslöst:

Haltepunkt-Typ Aktion
e (ausführen) Wird ausgelöst, wenn der Prozessor eine Anweisung von der angegebenen Adresse abruft.
r (lesen/schreiben) Wird ausgelöst, wenn der Prozessor Speicher an der angegebenen Adresse liest oder schreibt.
w (schreiben) Wird ausgelöst, wenn der Prozessor an der angegebenen Adresse in den Speicher schreibt.
i (i/o) Wird ausgelöst, wenn auf den I/O-Port an der angegebenen Adresse zugegriffen wird.

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 dem im vorangegangenen Absatz genannten Beispiel wäre ein einzelner Schreibvorgang, der den Bereich 0x70001000 bis 0x7000100F umfasst, oder ein Schreibvorgang, der nur das Byte an 0x70001009 umfasst, ein überlappender Vorgang. In einer solchen Situation ist, ob der Haltepunkt ausgelöst wird, prozessorabhängig. Einzelheiten darüber, wie diese Situation auf einem bestimmten Prozessor gehandhabt wird, finden Sie im Handbuch der Prozessorarchitektur unter „Debug-Register“ oder „Debug-Steuerregister“. Um einen bestimmten Prozessortyp als Beispiel zu nehmen: Auf einem x86-Prozessor wird ein Haltepunkt zum Lesen oder Schreiben immer dann ausgelöst, wenn sich der Bereich, auf den zugegriffen wird, mit dem Haltepunktbereich überschneidet.

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 z. B. der aktuelle Prozessor 3 ist und Sie den Befehl ba e1 MyAddress verwenden, um einen Haltepunkt an MyAddress zu setzen, löst jeder Prozessor – nicht nur Prozessor 3 – , der an dieser Adresse eine Aktion durchführt, den Haltepunkt aus. Dies gilt auch für Software-Haltepunkte.

Software-Haltepunkte

Software-Haltepunkte werden, im Gegensatz zu Prozessor-Haltepunkten, vom Debugger gesteuert. Wenn der Debugger einen Software-Haltepunkt an einer bestimmten Stelle festlegt, ersetzt er vorübergehend den Inhalt dieser Speicherstelle durch eine Halteanweisung. Der Debugger merkt sich den ursprünglichen Inhalt dieses Speicherplatzes, sodass der Debugger, wenn dieser Speicherplatz im Debugger angezeigt wird, den ursprünglichen Inhalt dieses Speicherplatzes anzeigt und nicht die Break-Anweisung. Wenn der Zielprozess den Code an dieser Stelle ausführt, veranlasst die Break-Anweisung den Prozess, in den Debugger zu wechseln. Nachdem Sie die von Ihnen gewünschten Aktionen durchgeführt haben, können Sie das Ziel veranlassen, die Ausführung wieder aufzunehmen, und die Ausführung wird mit der Anweisung fortgesetzt, die sich ursprünglich an dieser Stelle befand.

Verfügbarkeit der Prozessor-Haltepunkt-Typen

Die Option i (i/o) ist nur während des Debuggens im Kernel-Modus verfügbar.

Nicht alle Datengrößen können mit allen Prozessor-Haltepunkt-Typen verwendet werden. Die zulässigen Größen hängen vom Prozessor des Zielcomputers ab. Einzelheiten finden Sie unter ba (Break bei Zugriff).

Beschränkungen von Software-Haltepunkten und Prozessor-Haltepunkten

Es ist möglich, eine Datenadresse anstelle einer Programmadresse anzugeben, wenn Sie die Befehle bp oder bm /a verwenden. Aber auch wenn eine Datenadresse angegeben wird, erstellen diese Befehle Software-Haltepunkte, keine Prozessor-Haltepunkte. Wenn der Debugger einen Software-Haltepunkt an einer bestimmten Stelle setzt, ersetzt er vorübergehend den Inhalt dieser Speicherstelle durch einen Haltebefehl. Dadurch wird das ausführbare Image nicht beschädigt, denn der Debugger merkt sich den ursprünglichen Inhalt dieses Speicherorts, und wenn der Zielprozess versucht, diesen Code auszuführen, kann der Debugger entsprechend reagieren. Wenn jedoch ein Software-Haltepunkt an einem Speicherort für Daten festgelegt wird, kann das daraus resultierende Überschreiben zu einer Beschädigung der Daten führen. Daher ist das Festlegen eines Software-Haltepunkts an einem Datenspeicherort nur dann sicher, wenn Sie sicher sind, dass dieser Speicherort nur als ausführbarer Code verwendet wird.

Die Befehle bp, bu und bm legen Software-Haltepunkte fest, indem sie den Prozessor-Befehl durch einen Haltebefehl ersetzen. Sie können daher nicht in schreibgeschütztem Code oder anderem Code verwendet werden, der nicht überschrieben werden kann. Um einen Haltepunkt in solchem Code festzulegen, müssen Sie ba (Break bei Zugriff) mit der Option e (Ausführen) verwenden.

Sie können nicht mehrere Prozessor-Haltepunkte an derselben Adresse erstellen, die sich nur in dem Befehl unterscheiden, der automatisch ausgeführt wird, wenn der Haltepunkt ausgelöst wird. Sie können jedoch mehrere Haltepunkte an derselben Adresse erstellen, die sich in ihren anderen Einschränkungen unterscheiden (z. B. können Sie mehrere Haltepunkte an derselben Adresse erstellen, indem Sie den Befehl ba mit unterschiedlichen Werten der Optionen /p, /t, /c und /C verwenden).

Der erste Haltepunkt in einem Benutzermodus-Prozess (typischerweise festgelegt in der Funktion main oder einer entsprechenden Funktion) kann kein Prozessor-Haltepunkt sein.

Die Anzahl der Prozessor-Haltepunkte, die unterstützt werden, hängt von der Architektur des Zielprozessors ab.

Steuerung von Software-Haltepunkten und Prozessor-Haltepunkten

Software-Haltepunkte können mit den Befehlen bp (Haltepunkt setzen), bm (Symbolhaltepunkt setzen) und bu (unaufgelösten Haltepunkt setzen) erstellt werden. Prozessor-Haltepunkte können mit dem Befehl ba (Break bei Zugriff) erstellt werden. Befehle, die Haltepunkte deaktivieren, aktivieren und modifizieren, gelten für alle Arten von Haltepunkten. Befehle, die eine Liste von Haltepunkten anzeigen, umfassen alle Haltepunkte und geben den Typ jedes einzelnen an. Eine Liste dieser Befehle finden Sie unter Methoden zur Steuerung von Haltepunkten.

Das Dialogfeld WinDbg Breakpoints zeigt alle Haltepunkte an und kennzeichnet Prozessor-Haltepunkte mit der Notation „e“, „r“, „w“ oder „i' gefolgt von der Größe des Blocks. Über dieses Dialogfeld können Sie jeden Haltepunkt ändern. Mit dem Textfeld Command in diesem Dialogfeld können Sie jede Art von Haltepunkt erstellen. Wenn Sie einen Prozessor-Haltepunkt erstellen möchten, beginnen Sie die Eingabe mit „ba“. Wenn Sie einen Haltepunkt mit der Maus im WinDbg Disassembly-Fenster oder Source-Fenster festlegen, erstellt der Debugger einen nicht aufgelösten Software-Haltepunkt.

Prozessor-Haltepunkte werden in den Debug-Registern des Prozessors gespeichert. Es ist möglich, einen Haltepunkt festzulegen, indem Sie den Wert eines Debug-Registers manuell bearbeiten, aber davon wird dringend abgeraten.