Debugging Tools for Windows |
本节包含了一些在各种命令中使用 MASM 和 C++ 表达式的示例。
在这份帮助文档的其它所有章节中,示例都使用了 MASM 表达式语法(除非另有说明)。C++ 表达式语法对于管理结构和变量非常有用,但它不是很适合解析调试命令的参数。
当为了常用目的使用调试命令或者扩展命令时,应该设置 MASM 表达式语法为缺省语法。如果某个参数需要使用 C++ 表达式语法,那么用 @@( ) 语法。
可以用比较运算符来创建条件断点。下面的例子使用 MASM 表达式语法。因为当前的缺省基数是 16,所以数值 20 使用了 0n 前缀表示十进制数:
在本例中,MyVar 是 C 源代码中的整数。因为 MASM 解析器把所有符号当做地址,所以需要 poi 运算符取 MyVar 的值。
下面的命令如果 eax 大于 ebx 打印出 ecx 的值,如果 eax 小于 ebx 打印出 7,如果 eax 等于 ebx 打印出 3。使用 MASM 表达式求解器,所以单个等于号(=)当做比较运算符使用,而不是赋值运算符:
在 C++ 语法中,指示寄存器需要用 @ 记号,比较运算符是双等于号(==),需要把 BOOL 显式强制转化为 int。所以,在 C++ 语法中,这条命令变成:
如果 myInt 类型是 ULONG32,而且用 MASM 表达式求解器,那么下面两条命名都将显示 myInt 的值:
0:000> dd myInt L1
然而,下面的命令将显示 myInt 的地址。
C++ 表达式中不能使用源代码行数表达式。下面的例子在 C++ 表达式中使用 @@( ) 语法嵌入了一个 MASM 表达式。本例把MyPtr 的值设置为Myfile.c 文件的第43行代码所在的地址。
下面的命令将 MASM 设置为缺省的表达式求解器,然后,把 Expression1 和 Expression3 做为 MASM 表达式求解,把 Expression2 做为 C++ 表达式求解:
0:000> bp Expression1 + @@( Expression2 ) + Expression3
如果 myInt 是 ULONG64 类型,而且知道在内存中紧跟着它的是另外一个 ULONG64 类型,可以用下面任一条命令在该位置设置一个存取断点。(注意用了指针运算)
0:000> ba r8 myInt + 8
C++ 表达式求解器把伪寄存器强制转换为正确的类型。例如,$teb 被强制转换为 TEB*。所以下面的命令将显示进程 ID: