通过调试器命令窗口或 WinDbg 图形界面创建 断点时,可以使用以下语法元素。
断点中的地址
断点支持多种地址语法,包括虚拟地址、函数偏移量和源行号。 例如,可以使用以下命令中的任何一个设置断点:
0:000> bp 0040108c
0:000> bp main+5c
0:000> bp `source.c:31`
有关此语法的详细信息,请参阅 数字表达式语法、 源行语法和单个命令主题。
方法上的断点
如果要在 MyClass 类的 MyMethod 方法上放置断点,可以使用两种不同的语法:
在 MASM 表达式语法中,可以通过双冒号或双下划线来指示方法。
0:000> bp MyClass::MyMethod 0:000> bp MyClass__MyMethod
在C++表达式语法中,必须通过双冒号来指示方法。
0:000> bp @@( MyClass::MyMethod )
如果要使用更复杂的断点命令,则应使用 MASM 表达式语法。 有关表达式语法的详细信息,请参阅 “计算表达式”。
使用 MASM 复杂表达式的断点
若要对复杂函数(包括包含空格的函数以及C++公共类的成员)设置断点,请将表达式括在括号中。 例如,使用 bp (??MyPublic) 或 bp (运算符 new) 。
更通用的技术是使用 @!chars“ 语法。 这是 MASM 评估器中的一种特殊转义,可用于提供任意文本以进行符号解析。 必须以 @! 这三个符号开头,最后加上引号()。 如果没有此语法,则不能在 MASM 计算器中的符号名称中使用空格、尖括号(<或 >)或其他特殊字符。 此语法专用于名称,而不是参数。 模板和重载是需要此引号表示法的符号的主要来源。 还可以使用 @!"chars" 语法设置 bu 命令,如下面的代码示例所示。
0:000> bu @!"ExecutableName!std::pair<unsigned int,std::basic_string<unsigned short,std::char_traits<unsigned short>,std::allocator<unsigned short> > >::operator="
在此示例中, ExecutableName 是可执行文件的名称。
此转义语法对C++(例如重载运算符)而不是 C 更有用,因为 C 函数名称中没有空格(或特殊字符)。 但是,由于 .NET Framework 中大量重载的使用,此语法对于许多托管代码也很重要。
若要在C++语法中对任意字符设置断点,请使用 bu @@c++(text) 用于C++兼容符号。
脚本中的断点
断点 ID 不必显式引用。 相反,可以使用解析为对应于断点 ID 的整数的数字表达式。 若要指示表达式应解释为断点,请使用以下语法。
b?[Expression]
在此语法中,需要方括号, Expression 代表解析为与断点 ID 对应的整数的任何数值表达式。
此语法允许调试器脚本以编程方式选择断点。 在以下示例中,断点会根据用户定义的伪寄存器的值而更改。
b?[@$t0]
断点伪寄存器
如果想要在表达式中引用断点地址,则可以将 伪寄存器 与 $bpNumber 语法一起使用,其中 Number 是断点 ID。 有关此语法的详细信息,请参阅 Pseudo-Register 语法。
不明确的断点解析
在调试器引擎的版本 10.0.25310.1001 及更高版本中,现在支持不明确的断点解析。 模糊断点允许调试器在某些情况下设置断点,这些情况下断点表达式会解析到多个位置。 有关详细信息,请参阅 不明确的断点解析。