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

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

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

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

仅当指定条件为 true 时,断点才会导致调试器中断。 “w”是“when”的缩写。 条件表达式可以是可与 dx (Display Debugger 对象模型表达式) 命令一起使用的任何内容。 这包括大多数 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 (Go from 条件断点) 命令。 虽然不再建议使用这些设置条件断点的方法,但它们仍然有效,你可能会看到在其他源中引用了此语法。

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

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

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

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