Freigeben über


Bedingte Haltepunkte in WinDbg und anderen Windows-Debuggern

Bedingte Haltepunkte in WinDbg und anderen Windows-Debuggern sind nützlich, wenn Sie nur dann umbrechen müssen, wenn eine bestimmte Bedingung erfüllt ist.

Ein bedingter Haltepunkt wird mit dem Parameter "/w" für bp (Haltepunkt festlegen) oder einem anderen Haltepunktbefehl erstellt. Die grundlegende Syntax des Befehls lautet:

0:000> bp /w "(Condition)" Address

Der Haltepunkt verursacht nur einen Umbruch in den Debugger, wenn die angegebene Bedingung wahr ist. Das "w" ist eine Abkürzung für "when". Der Bedingungsausdruck kann alles sein, was mit dem Befehl dx (Display Debugger Object Model Expression) verwendet werden kann. Dazu gehören die meisten C++-Stilausdrücke, einschließlich Vergleiche, Arithmetik, Zeigervorgänge und andere. Beispielsweise kann ein grundlegender bedingter Haltepunkt, der nur einbricht, wenn eine Variable mehr als 20 ist, wie folgt geschrieben werden:

0:000> bp /w "MyVar > 20" `mysource.cpp:143`

Da die Bedingung mithilfe des Debuggerobjektmodells ausgewertet wird, können Sie auch Elemente wie natVis-Unterstützung nutzen. Angenommen, myVec ist ein std::vector<int>, können Sie eine Bedingung erstellen, z. B.:

0:000> bp /w "myVec.Count() == 4" `mysource.cpp:143`

Dies wird unterbrochen, wenn Zeile 143 von mysource.cpp ausgeführt wird, während die myVec-Variable vier Elemente enthält.

Über natvis hinaus können Sie auch eine JavaScript-Funktion aufrufen. Wenn Sie ein Skript mit dem WinDbg-Skriptfenster oder dem Befehl .scriptload (Load Script) laden, der eine Funktion namens "myFunc" enthält, können Sie einen Haltepunkt wie folgt festlegen:

0:000> bp /w "@$scriptContents.myFunc()" `mysource.cpp:143`

Weitere Informationen zum Schreiben von JavaScript-Funktionen und -Erweiterungen im Debugger finden Sie unter JavaScript Debugger Scripting

Während Ausdrücke auf höherer Ebene in der Regel am nützlichsten sind, ist es auch möglich, Register mithilfe dieser Ausdrücke auszuwerten. So könnten Sie beispielsweise einen Haltepunkt erstellen, der nur ausgelöst wird, wenn der Stapelzeiger einen Schwellenwert erreicht:

0:000> bp /w "@esp < 0x6ff9f8" `mysource.cpp:143`

Legacy-Syntax für bedingten Haltepunkt

Vor der Verfügbarkeit des Parameters "/w" für die Haltepunktbefehle war die empfohlene Methode zum Festlegen von bedingten Haltepunkten die Verwendung des Befehls j (Execute If - Else) oder des IF-Tokens, gefolgt von dem Befehl gc (Go from Conditional Breakpoint). Obwohl diese Methoden zum Festlegen von bedingten Haltepunkten nicht mehr empfohlen werden, funktionieren sie weiterhin, und Möglicherweise wird auf diese Syntax in anderen Quellen verwiesen.

Die grundlegende Syntax für einen bedingten Haltepunkt mit dem Befehl j lautet wie folgt:

0:000> bp Address "j (Condition) 'OptionalCommands'; 'gc' "

Die grundlegende Syntax für einen bedingten Haltepunkt mit dem .if-Token lautet wie folgt:

0:000> bp Address ".if (Condition) {OptionalCommands} .else {gc}"