符号语法和符号匹配

符号允许你直接操作正在调试的程序使用的令牌。 例如,可以使用 command bp main 在函数 main 处设置断点,或使用命令 dd MyInt L1 显示整数变量 MyInt

在许多情况下,符号可用作调试器命令中的参数。 对大多数数字参数都支持此操作,并且在某些文本参数中也受支持。 除了符号语法的一般规则外,还存在在这些情况下适用的符号语法规则。

常规符号语法规则

符号名称由一个或多个字符组成,但始终以字母、下划线 (_) 、问号 () 或美元符号 () $ 开头。

符号名称可能由模块名称限定。 () 感叹号将模块名称与符号 ((例如 mymodule!main) )分隔开来。 如果未使用模块名称,符号仍可以带有感叹号前缀。 使用没有模块名称的感叹号尤其有用,即使对于局部变量,也可以向调试器命令指示参数是一个名称而不是十六进制数。 例如,变量 淡出 将由 dt (Display Type) 命令读取为地址,除非它以感叹号或 -n 选项为前缀。 但是,若要指定符号是本地符号,请在符号前面加上美元符号 ( $ ) 和感叹号 (!) ,就像 在 $!lime 中一样。

符号名称完全不区分大小写。 这意味着调试器无法正确理解程序中的 myIntMyInt ;引用其中一个命令的任何命令都可以访问另一个命令,而不考虑命令的大小写方式。

数字表达式中的符号语法

调试器理解两种不同类型的表达式:Microsoft 宏汇编程序 (MASM) 表达式和 C++ 表达式。 就符号而言,这两种语法形式有所不同,如下所示:

  • 在 MASM 表达式中,每个符号都解释为地址。 根据符号引用的内容,这将是全局变量、局部变量、函数、段、模块或任何其他已识别标签的地址。

  • 在 C++ 表达式中,每个符号都根据其类型进行解释。 根据符号引用的内容,它可以解释为整数、数据结构、函数指针或任何其他数据类型。 与 C++ 数据类型不对应的符号 ((如未修改的模块名称) )将导致语法错误。

有关何时以及如何使用每种语法的说明,请参阅 “计算表达式”。

如果使用 MASM 表达式语法,任何可以解释为十六进制数字或寄存器 (的符号(例如 BadFeedebX) )应始终以感叹号为前缀。 这可确保调试器将其识别为符号。

(“设置符号后缀”) 命令的 ss 可用于设置符号后缀。 这指示调试器自动将“A”或“W”追加到它找不到的任何符号名称。

许多 Win32 例程都存在于 ASCII 和 Unicode 版本中。 这些例程通常分别将“A”或“W”追加到其名称的末尾。 搜索这些符号时,使用符号后缀将帮助调试器。

默认情况下,后缀匹配不处于活动状态。

文本表达式中的符号语法

符号可用于某些命令的文本参数-例如 ,bm (设置断点) x (检查符号)

这些文本参数支持各种通配符和说明符。 有关详细信息,请参阅 字符串通配符语法 。 除了标准字符串通配符外,用于指定符号的文本表达式还可以以前导下划线为前缀。 将此与符号匹配时,调试器会将此值视为任何数量的下划线,甚至为零。

在文本表达式中匹配符号时,不使用符号后缀。