WinDbg 和其他 Windows 调试器中的条件断点

仅在满足特定条件才需要中断时,WinDbg 和其他 Windows 调试器中的条件中断点非常有用。

条件断点可使用 bp(设置断点)或其他断点命令的“/w”参数来创建。 该命令的基本语法如下:

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

只有当指定条件为 true 时,断点才会中断到调试器。 “w”是“when”的缩写。 条件表达式可以是任何可用于 dx(显示调试器对象模型表达式)命令的表达式。 这包括大多数 C++ 样式的表达式,包括比较、算术、指针操作等。 例如,一个基本的条件断点只有在变量大于 20 时才会断开,则可以编写为:

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

由于条件使用调试器对象模型进行评估,因此还可以利用 NatVis 支持等功能。 例如,假设 myVec 是一个 std::vector<int>,则可以创建如下条件:

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

当 myVec 变量包含 4 个元素时,执行 mysource.cpp 的第 143 行将会中断。

除了 natvis,还可以调用 JavaScript 函数。 如果使用 WinDbg 脚本窗口或 .scriptload(加载脚本)命令加载了一个脚本,其中包含一个名为“myFunc”的函数,则可以按照如下所示来设置断点:

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

有关在调试器中编写 JavaScript 函数和扩展的详细信息,请参阅 JavaScript 调试器脚本

虽然较高级别的表达式通常最为有用,但也可以使用这些表达式来计算寄存器。 例如,可以创建一个仅当堆栈指针达到某个阈值时才触发的断点:

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

旧式条件断点语法

在断点命令使用“/w”参数之前,设置条件断点的推荐方法是使用 j (Execute If - Else) 命令或 .if 令牌,然后使用 gc(从条件断点开始)命令。 虽然不再推荐使用这些设置条件断点的方法,但它们仍然有效,而其他资料中也会提及这种语法。

使用 j 命令创建条件断点的基本语法如下所示:

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

使用 .if 令牌创建条件断点的基本语法如下所示:

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