Debugging Tools for Windows

表达式示例

本节包含了一些在各种命令中使用 MASM 和 C++ 表达式的示例。

在这份帮助文档的其它所有章节中,示例都使用了 MASM 表达式语法(除非另有说明)。C++ 表达式语法对于管理结构和变量非常有用,但它不是很适合解析调试命令的参数。

当为了常用目的使用调试命令或者扩展命令时,应该设置 MASM 表达式语法为缺省语法。如果某个参数需要使用 C++ 表达式语法,那么用 @@( ) 语法。

条件断点

可以用比较运算符来创建条件断点。下面的例子使用 MASM 表达式语法。因为当前的缺省基数是 16,所以数值 20 使用了 0n 前缀表示十进制数:

0:000> bp MyFunction+0x43 "j ( poi(MyVar)>0n20 ) ''; 'gc' " 

在本例中,MyVar 是 C 源代码中的整数。因为 MASM 解析器把所有符号当做地址,所以需要 poi 运算符取 MyVar 的值。

条件表达式

下面的命令如果 eax 大于 ebx 打印出 ecx 的值,如果 eax 小于 ebx 打印出 7,如果 eax 等于 ebx 打印出 3。使用 MASM 表达式求解器,所以单个等于号(=)当做比较运算符使用,而不是赋值运算符:

0:000> ? ecx*(eax>ebx) + 7*(eax<ebx) + 3*(eax=ebx) 

在 C++ 语法中,指示寄存器需要用 @ 记号,比较运算符是双等于号(==),需要把 BOOL 显式强制转化为 int。所以,在 C++ 语法中,这条命令变成:

0:000> ?? @ecx*(int)(@eax>@ebx) + 7*(int)(@eax<@ebx) + 3*(int)(@eax==@ebx) 

C++ 表达式示例

如果 myInt 类型是 ULONG32,而且用 MASM 表达式求解器,那么下面两条命名都将显示 myInt 的值:

0:000> ?? myInt 
0:000> dd myInt L1 

然而,下面的命令将显示 myInt地址

0:000> ? myInt 

混合表达式示例

C++ 表达式中不能使用源代码行数表达式。下面的例子在 C++ 表达式中使用 @@( ) 语法嵌入了一个 MASM 表达式。本例把MyPtr 的值设置为Myfile.c 文件的第43行代码所在的地址。

0:000> ?? MyPtr = @@( `myfile.c:43` )

下面的命令将 MASM 设置为缺省的表达式求解器,然后,把 Expression1Expression3 做为 MASM 表达式求解,把 Expression2 做为 C++ 表达式求解:

0:000> .expr /s masm 
0:000> bp Expression1 + @@( Expression2 ) + Expression3 

如果 myInt 是 ULONG64 类型,而且知道在内存中紧跟着它的是另外一个 ULONG64 类型,可以用下面任一条命令在该位置设置一个存取断点。(注意用了指针运算)

0:000> ba r8 @@( &myInt + 1 ) 
0:000> ba r8 myInt + 8 

结构体

C++ 表达式求解器把伪寄存器强制转换为正确的类型。例如,$teb 被强制转换为 TEB*。所以下面的命令将显示进程 ID:

kd> ??  @$teb->ClientId.UniqueProcess 
 

Build machine: CAPEBUILD