符号语法和符号匹配
符号允许你直接操作正在调试的程序使用的令牌。 例如,可以使用命令 bp main在函数main设置断点,或使用命令 dd MyInt L1 显示整数变量 MyInt。
在许多情况下,符号可用作调试器命令中的参数。 大多数数值参数都支持此操作,某些文本参数也支持此操作。 除了符号语法的一般规则外,还有适用于上述每种情况的符号语法规则。
常规符号语法规则
符号名称由一个或多个字符组成,但始终以字母、下划线 (_) 、问号 (?) 或美元符号 ($) 开头。
符号名称可由模块名称限定。 感叹号 (!) 将模块名称与符号 ((例如 mymodule!main) )分隔开来。 如果未使用模块名称,则符号仍可使用感叹号作为前缀。 使用没有模块名称的感叹号可能特别有用,即使对于局部变量,也可以向调试器命令指示参数是名称而不是十六进制数。 例如,变量 fade 将由 dt (Display Type) 命令读取为地址,除非它以感叹号为前缀或使用 -n 选项。 但是,若要指定符号是本地符号,请在符号前面加上美元符号 ( $ ) ,感叹号 ( !) ,就像 在 $!lime 中一样。
符号名称完全不区分大小写。 这意味着调试器无法正确理解程序中是否存在 myInt 和 MyInt ;引用其中一个命令的任何命令都可以访问另一个命令,而不管该命令的大小写方式如何。
数值表达式中的符号语法
调试器理解两种不同类型的表达式:Microsoft 宏汇编程序 (MASM) 表达式和 C++ 表达式。 就符号而言,这两种语法形式的不同之处如下:
在 MASM 表达式中,每个符号都解释为一个地址。 根据符号所引用的内容,它将是全局变量、局部变量、函数、段、模块或任何其他已识别标签的地址。
在 C++ 表达式中,每个符号都根据其类型进行解释。 根据符号所引用的内容,它可能被解释为整数、数据结构、函数指针或任何其他数据类型。 与 C++ 数据类型 ((如未修改的模块名称) )不对应的符号将导致语法错误。
有关何时以及如何使用每种类型的语法的说明,请参阅 计算表达式。
如果使用 MASM 表达式语法,任何可解释为十六进制数或寄存器 ((例如 BadFeed、 ebX) )的符号都应始终以感叹号作为前缀。 这可确保调试器将其识别为符号。
ss (Set Symbol Suffix) 命令可用于设置符号后缀。 这会指示调试器自动将“A”或“W”追加到它无法找到的任何符号名称。
许多 Win32 例程同时存在于 ASCII 和 Unicode 版本中。 这些例程的名称末尾通常分别追加一个“A”或“W”。 在搜索这些符号时,使用符号后缀将有助于调试器。
默认情况下,后缀匹配不处于活动状态。
文本表达式中的符号语法
符号可用于某些命令的文本参数-例如, bm (设置断点) 和 x (检查符号) 。
这些文本参数支持各种通配符和说明符。 有关详细信息 ,请参阅字符串通配符语法 。 除了标准字符串通配符之外,用于指定符号的文本表达式还可以以前导下划线作为前缀。 将此与符号匹配时,调试器会将此视为任何数量的下划线,甚至为零。
在文本表达式中匹配符号时,不使用符号后缀。