Bedingte Haltepunkte in WinDbg und anderen Windows-Debuggern
Bedingte Haltepunkte in WinDbg und anderen Windows-Debuggern sind nützlich, wenn Sie nur dann eingreifen wollen, wenn eine bestimmte Bedingung erfüllt ist.
Ein bedingter Haltepunkt wird mit dem Parameter „/w“ für den Befehl bp (Haltepunkt setzen) oder einen anderen Haltepunktbefehl erstellt. Die grundlegende Syntax des Befehls lautet:
0:000> bp /w "(Condition)" Address
Der Haltepunkt führt nur dann zu einer Unterbrechung im Debugger, wenn die angegebene Bedingung erfüllt ist. Das „w“ ist eine Abkürzung für „wenn“. Der Bedingungsausdruck kann alles sein, was mit dem Befehl dx (Debugger-Objektmodellausdruck anzeigen) verwendet werden kann. Dazu gehören die meisten Ausdrücke im Stil von C++, einschließlich Vergleichen, Arithmetik, Zeigeroperationen und andere. Ein einfacher bedingter Haltepunkt, der nur dann greift, wenn eine Variable größer als 20 ist, könnte zum Beispiel so geschrieben werden:
0:000> bp /w "MyVar > 20" `mysource.cpp:143`
Da die Bedingung anhand des Debugger-Objektmodells ausgewertet wird, können Sie auch Dinge wie die Unterstützung von NatVis nutzen. In der Annahme, dass myVec ein std::vector<int>
ist, könnten Sie zum Beispiel eine Bedingung wie die folgende erstellen:
0:000> bp /w "myVec.Count() == 4" `mysource.cpp:143`
Dies führt zu einem Break, wenn Zeile 143 von mysource.cpp ausgeführt wird, während die Variable myVec 4 Elemente hat.
Über natvis hinaus können Sie auch eine JavaScript-Funktion aufrufen. Wenn Sie mit dem WinDbg-Skriptfenster oder dem Befehl .scriptload (Skript laden) ein Skript laden, das eine Funktion namens „myFunc“ enthält, könnten Sie einen Haltepunkt wie diesen 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
Obwohl Ausdrücke auf höherer Ebene in der Regel am nützlichsten sind, ist es auch möglich, Register mit diesen Ausdrücken auszuwerten. Sie könnten zum Beispiel einen Haltepunkt erstellen, der nur ausgelöst wird, wenn der Stack-Zeiger einen bestimmten Schwellenwert erreicht:
0:000> bp /w "@esp < 0x6ff9f8" `mysource.cpp:143`
Veraltete Syntax für bedingte Haltepunkte
Bevor es den Parameter „/w“ für die Haltepunktbefehle gab, bestand die empfohlene Methode, bedingte Haltepunkte festzulegen, darin, den Befehl j (Execute If – Else) oder das Token .if zu verwenden, gefolgt von dem Befehl gc (von bedingtem Haltepunkt ausführen). Diese Methoden zum Festlegen von bedingten Haltepunkten werden zwar nicht mehr empfohlen, funktionieren aber immer noch und Sie finden diese Syntax möglicherweise in anderen Quellen wieder.
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, der das Token .if verwendet, lautet wie folgt:
0:000> bp Address ".if (Condition) {OptionalCommands} .else {gc}"