Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Haltepunkte, die vom Prozessor auf Anforderung des Debuggers gesteuert werden, werden als Prozessor-Haltepunkte oder Datenhaltepunkte bezeichnet. Haltepunkte, die direkt vom Debugger gesteuert werden, werden als Software-Haltepunkte bezeichnet.
Anmerkung Obwohl der Begriff "Datenhaltepunkt " häufig als Synonym für den Prozessorhaltepunkt verwendet wird, kann dieser Begriff irreführend sein. Es gibt zwei grundlegende Typen von Haltepunkten: Prozessor-Haltepunkte, die vom Prozessor gesteuert werden, und Software-Haltepunkte, die vom Debugger gesteuert werden. Prozessor-Haltepunkte werden in der Regel für Programmdaten festgelegt - dies ist der Grund, warum sie als "Datenbruchpunkte" bezeichnet werden- aber auch für ausführbaren Code festgelegt werden können. Software-Breakpoints werden normalerweise im ausführbaren Code gesetzt, können jedoch auch bei Programmdaten gesetzt werden. Leider ist es in der Debugging-Literatur üblich, auf Prozessor-Haltepunkte als "Datenhaltepunkte" zu verweisen, auch wenn sie für ausführbaren Code festgelegt sind.
Prozessorunterbrechungen
Ein Prozessorunterbrechungspunkt wird ausgelöst, wenn auf einen bestimmten Speicherspeicherort zugegriffen wird. Es gibt vier Typen von Prozessorunterbrechungen, die der Art des Arbeitsspeicherzugriffs entsprechen, der ihn auslöst:
| Haltepunkttyp | Maßnahme |
|---|---|
| e (ausführen) | Wird ausgelöst, wenn der Prozessor eine Anweisung aus der angegebenen Adresse abruft. |
| r (Lese-/Schreibzugriff) | Wird ausgelöst, wenn der Prozessor Arbeitsspeicher an der angegebenen Adresse liest oder schreibt. |
| w (schreiben) | Wird ausgelöst, wenn der Prozessor einen Schreibvorgang im Arbeitsspeicher an der angegebenen Adresse durchführt. |
| i (i/o) | Wird ausgelöst, wenn auf den E/A-Port an der angegebenen Adresse zugegriffen wird. |
Jeder Prozessor-Haltepunkt hat eine zugeordnete Größe. 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 auf diesen 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 vorherigen Absatz angegebenen Beispiel wäre ein einzelner Schreibvorgang, der den Bereich 0x70001000 bis 0x7000100F enthält, oder ein Schreibvorgang, der nur das Byte an 0x70001009 enthält, ein überlappender Vorgang. Ob der Haltepunkt in einer solchen Situation ausgelöst wird, ist prozessorabhängig. Ausführliche Informationen dazu, wie diese Situation auf einem bestimmten Prozessor behandelt wird, finden Sie im Prozessorarchitekturhandbuch, und suchen Sie nach "Debugregister" oder "Debugsteuerelementregister". Um beispielsweise einen bestimmten Prozessortyp als Beispiel zu verwenden, wird bei einem x86-Prozessor ein Lese- oder Schreibhaltepunkt ausgelöst, wenn der zugegriffene Bereich den Haltepunktbereich überlappt.
Wenn ein e (execute) 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 wirkt sich möglicherweise oder nicht auf einen Benutzermodusprozess aus, je nachdem, ob der Benutzermoduscode den Debugregisterstatus verwendet, und ob ein an den Benutzermodus angefügter Debugger vorhanden ist.
Um die bestehenden Datenunterbrechungspunkte des aktuellen Prozesses auf einen anderen Registerkontext anzuwenden, verwenden Sie den .apply_dbp (Apply Data Breakpoint to Context)-Befehl.
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.
Software-Haltepunkte
Software-Haltepunkte werden im Gegensatz zu Prozessor-Haltepunkten vom Debugger gesteuert. Wenn der Debugger einen Software-Haltepunkt an einem bestimmten Speicherort festlegt, ersetzt er vorübergehend den Inhalt dieses Speicherorts durch eine Unterbrechungsanweisung. Der Debugger merkt sich den ursprünglichen Inhalt dieses Speicherorts. Wenn dieser Speicher im Debugger angezeigt wird, zeigt der Debugger den ursprünglichen Inhalt dieses Speicherorts und nicht die Unterbrechungsanweisung an. Wenn der Zielprozess den Code an diesem Speicherort ausführt, führt die Unterbrechungsanweisung dazu, dass der Prozess in den Debugger umgebrochen wird. Nachdem Sie beliebige Aktionen Ihrer Wahl ausgeführt haben, können Sie die Ausführung des Ziels fortsetzen lassen. Die Ausführung wird dann mit der Anweisung fortgesetzt, die ursprünglich an diesem Speicherort war.
Verfügbarkeit von Prozessor-Breakpoint-Typen
Die i/o-Option ist nur während des Debuggings des Kernelmodus verfügbar.
Nicht alle Datengrößen können mit allen Prozessor-Haltepunkttypen verwendet werden. Die zulässigen Größen hängen vom Prozessor des Zielcomputers ab. Weitere Informationen finden Sie unter ba (Break on Access).
Einschränkungen von Software-Haltepunkten und Prozessor-Haltepunkten
Es ist möglich, bei Verwendung der Bp - oder bm /a-Befehle eine Datenadresse anstelle einer Programmadresse anzugeben. Selbst wenn jedoch ein Datenspeicherort angegeben ist, erstellen diese Befehle Software-Haltepunkte und keine Prozessor-Haltepunkte. Wenn der Debugger einen Software-Haltepunkt an einem bestimmten Speicherort platziert, ersetzt er vorübergehend den Inhalt dieses Speicherorts durch eine Unterbrechungsanweisung. Dadurch wird das ausführbare Image nicht beschädigt, da sich der Debugger an den ursprünglichen Inhalt dieses Speicherorts erinnert, und wenn der Zielprozess versucht, diesen Code auszuführen, kann der Debugger entsprechend reagieren. Wenn jedoch ein Software-Haltepunkt an einem Datenspeicherort festgelegt wird, kann das dadurch entstehende Überschreiben zu Datenbeschädigung 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 setzen Software-Haltepunkte, indem sie die Prozessoranweisung durch eine Unterbrechungsanweisung ersetzen. Daher können diese nicht in schreibgeschütztem Code oder in anderem Code verwendet werden, der nicht überschrieben werden kann. Um einen Haltepunkt in einem solchen Code festzulegen, müssen Sie ba (Break on Access) mit der Option e (execute) verwenden.
Sie können nicht mehrere Prozessorunterbrechungen 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 (Sie können z. B. mehrere Haltepunkte an derselben Adresse erstellen, indem Sie den Befehl "ba " mit unterschiedlichen Werten der Optionen "/p", "/t", "/c" und "/C ") verwenden.
Der anfängliche Haltepunkt in einem Benutzermodusprozess (in der Regel auf der Hauptfunktion oder deren Entsprechung festgelegt) kann kein Prozessorhaltepunkt sein.
Die Anzahl der unterstützten Prozessorunterbrechungen hängt von der Zielprozessorarchitektur ab.
Steuern von Software-Haltepunkten und Prozessor-Haltepunkten
Software-Haltepunkte können mit den Befehlen bp (Set Breakpoint), bm (Set Symbol Breakpoint) und bu (Set Unresolved Breakpoint) erstellt werden. Prozessor-Haltepunkte können mit dem Befehl ba (Unterbrechung bei Access) erstellt werden. Befehle, mit denen Haltepunkte deaktiviert, aktiviert und geändert werden, gelten für alle Arten von Haltepunkten. Befehle, die eine Liste von Haltepunkten anzeigen, enthalten alle Haltepunkte und geben den Typ der einzelnen Haltepunkte an. Eine Liste dieser Befehle finden Sie bei den Methoden zur Steuerung von Haltepunkten.
Im Dialogfeld "WinDbg Haltepunkte " werden alle Haltepunkte angezeigt, die Prozessor-Haltepunkte mit der Notation "e", "r", "w" oder "i" gefolgt von der Größe des Blocks angeben. Dieses Dialogfeld kann zum Ändern eines beliebigen Haltepunkts verwendet werden. Das Textfeld "Befehl " in diesem Dialogfeld kann verwendet werden, um einen beliebigen Haltepunkttyp zu erstellen. Wenn ein Prozessorbruchpunkt gewünscht wird, beginnen Sie mit der Eingabe mit "ba". Wenn Sie einen Haltepunkt mithilfe der Maus im Fenster "WinDbg Disassembly" oder "Quelle" festlegen, erstellt der Debugger einen nicht aufgelösten Software-Haltepunkt.
Prozessor-Haltepunkte werden in den Debugregistern des Prozessors gespeichert. Es ist möglich, einen Haltepunkt festzulegen, indem ein Debugregisterwert manuell bearbeitet wird, dies wird jedoch dringend abgeraten.