条件断点在 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 个元素时,执行第 143 行mysource.cpp时,这将中断。
除了 natvis,还可以调用 JavaScript 函数。 如果使用 WinDbg 脚本窗口或包含名为“myFunc”的函数的 .scriptload(加载脚本) 命令加载脚本,则可以设置如下所示的断点:
0:000> bp /w "@$scriptContents.myFunc()" `mysource.cpp:143`
有关在调试器中编写 JavaScript 函数和扩展的详细信息,请参阅 JavaScript 调试器脚本
虽然较高级别的表达式通常是最有用的,但也可以使用这些表达式计算寄存器。 例如,可以创建一个仅当堆栈指针达到某个阈值时触发的断点:
0:000> bp /w "@esp < 0x6ff9f8" `mysource.cpp:143`
旧条件断点语法
在“/w”参数尚未用于断点命令时,设置条件断点的推荐的方法是使用j(执行 If - Else)命令或.if令牌,然后使用gc(从条件断点继续)命令。 虽然不再建议使用这些设置条件断点的方法,但它们仍然有效,你可能会看到其他源中引用的此语法。
使用 j 命令的条件断点的基本语法如下所示:
0:000> bp Address "j (Condition) 'OptionalCommands'; 'gc' "
使用 .if 标记的条件断点的基本语法如下所示:
0:000> bp Address ".if (Condition) {OptionalCommands} .else {gc}"