Freigeben über


Risiken beim Festlegen von Haltepunkten

Wenn Sie einen Haltepunkt festlegen, indem Sie eine Speicheradresse oder ein Symbol plus einen Offset angeben, dürfen Sie diesen Haltepunkt nicht in die Mitte einer Anweisung setzen.

Betrachten Sie beispielsweise den folgenden disassemblierten Code.

770000f1 5e               pop     esi
770000f2 5b               pop     ebx
770000f3 c9               leave
770000f4 c21000           ret     0x10
770000f7 837ddc00         cmp     dword ptr [ebp-0x24],0x0

Die ersten drei Anweisungen sind nur ein Byte lang. Die vierte Anweisung ist jedoch drei Bytes lang. (Sie umfasst Bytes 0x770000F4, 0x770000F5 und 0x770000F6.) Wenn Sie mit dem Befehl bp, bu oder ba einen Haltepunkt für diese Anweisung festlegen möchten, müssen Sie die 0x770000F4 Adresse angeben.

Wenn Sie mithilfe des Befehls ba einen Haltepunkt in die 0x770000F5 Adresse einfügen, legt der Prozessor einen Haltepunkt an dieser Position ein. Dieser Haltepunkt wird jedoch nie ausgelöst, da der Prozessor 0x770000F4 als die tatsächliche Adresse der Anweisung betrachtet.

Wenn Sie mithilfe der Befehle bp oder bu einen Haltepunkt in die 0x770000F5 Adresse einfügen, schreibt der Debugger einen Haltepunkt an dieser Position. Dieser Haltepunkt kann jedoch das Ziel beschädigen, weil der Debugger Haltepunkte erstellt:

  1. Der Debugger speichert den Inhalt von 0x770000F5 und überschreibt diesen Speicher mit einer Haltepunktanweisung.

  2. Wenn Sie versuchen, diesen Arbeitsspeicher im Debugger anzuzeigen, zeigt der Debugger nicht die breakpoint-Anweisung an, die er geschrieben hat. Stattdessen zeigt der Debugger den Arbeitsspeicher an, der "vorhanden" sein sollte. Das heißt, der Debugger zeigt den ursprünglichen Arbeitsspeicher oder alle Änderungen an diesem Speicher an, die Sie seit dem Einfügen des Haltepunkts vorgenommen haben.

  3. Wenn Sie den BC-Befehl verwenden, um den Haltepunkt zu entfernen, stellt der Debugger den ursprünglichen Arbeitsspeicher an seinem richtigen Speicherort wieder her.

Wenn Sie einen Haltepunkt an 0x770000F5 setzen, speichert der Debugger dieses Byte, und hier wird eine Umbruchanweisung geschrieben. Wenn die Anwendung jedoch ausgeführt wird, erreicht sie die 0x770000F4 Adresse und erkennt diese Adresse als erstes Byte einer Multibyte-Anweisung. Der Prozessor versucht dann, 0x770000F4, 0x770000F5 und möglicherweise einige spätere Bytes in einer einzigen Anweisung zu kombinieren. Diese Kombination kann eine Vielzahl von Verhaltensweisen erzeugen, von denen keine wünschenswert ist.

Achten Sie daher beim Festlegen von Haltepunkten mithilfe eines bp-, bu- oder ba-Befehls darauf, dass Sie die Haltepunkte immer an der richtigen Adresse platzieren. Wenn Sie die grafische WinDbg-Benutzeroberfläche zum Hinzufügen von Haltepunkten verwenden, müssen Sie sich keine Sorgen um diese Situation machen, da die richtige Adresse automatisch ausgewählt wird.

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

Verwenden von Haltepunkten

Breakpointsyntax

bp, bu, bm (Breakpoint festlegen)

Mehrdeutige Breakpointauflösung

Nicht aufgelöste Breakpoints (bu Breakpoints)