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