windbg 调试器简明手册——第 2 章——求值表达式

       求值表达式(Evaluating Expressions)

目录

1.  表达式种类设置

2.  表达式中的数

3.  表达式中的符号

4.  表达式中的运算符


  调试器可以识别两种不同形式的表达式:MASM 表达式和 C++ 表达式。

    除非另有说明,本帮助文档中的示例均使用 Microsoft 宏汇编器 (MASM) 表达式。在 MASM 表达式中,所有符号(symbols)都视为地址

    C++ 表达式与实际 C++ 代码中使用的表达式相同。在这些表达式中,符号理解为相应的数据类型。

1.  表达式种类设置

         可以使用下列方式之一设置表达式求值器(expression evaluator):

(1) 在调试器启动之前使用  _NT_EXPR_EVAL 环境变量进行设置。

(2) 在调试器启动后使用 -ee{masm|c++} 命令行选项进行设置。

(3) 在调试器正在运行时,使用 .expr(选择表达式求值器(Choose Expression Evaluator))命令来显示或改变表达式求值。

如果不使用上述任何方法,调试器将使用 MASM 表达式求值器。

如果想在不改变调试器状态的情况下求值一个表达式,可以使用 `?(求值表达式)` 命令。

    所有命令和调试信息窗口都通过默认表达式求值器解释其参数,但以下情况除外:

(1) ??(求值 C++ 表达式) 命令总是使用 C++ 表达式求值器。

(2) 监视(Watch)窗口总是使用 C++ 表达式求值器。

(3) 局部变量窗口(Locals) 窗口总是使用 C++ 表达式求值器。

(4) 有些扩展命令总是使用 MASM 表达式求值器(而其他扩展命令只接受数值参数,而不是完整的表达式)。

(5) 如果表达式的任何部分包含在括号中,并且在表达式之前插入两个 at 符号 (@@),则表达式将由通常不会在这种情况下使用的表达式求值器进行求值。

    两个 @ 符号(@@) 允许你为单个命令的不同参数使用两个不同的求值器。它还允许你使用不同的方法计算长表达式的不同部分。你可以嵌套使用这两个@符号每次出现这两个@符号时,调试器都会切换到另一个表达式求值器。

注意:

C++表达式语法适用于操作结构体和变量,但并不适合解析调试器命令的参数当使用调试器命令进行一般操作或使用调试器扩展时,应将MASM表达式语法设置为默认表达式求值器。如果必须使用C++表达式语法指定特定参数,请使用双@符号(@@)语法。

2.  表达式中的数

    MASM 表达式中的数会根据当前进制进行解释。可以使用 `n`(设置进制)命令将默认进制设置为 16进制、10进制 或 8进制 。所有未加前缀的数都将以该进制解释可以通过指定 `0x`(十六进制)、`0n`(十进制)、`0t`(八进制)或 `0y`(二进制)前缀来覆盖默认进制。

    C++ 表达式中的数默认以十进制形式解释,除非另有指定。要指定十六进制整数,请在数字前添加 `0x`。要指定八进制整数,请在数前添加 `0`(零)。(但是,在调试器的输出中,有时会使用十进制前缀 `0n`。)

    如果要同时以多种进制显示数,请使用 `.formats`(显示数格式)命令。

3.  表达式中的符号

两种表达式对符号的解释不同:

(1)  在 MASM 表达式中,每一个符号都解释为一个地址。根据符号所指代的内容,该地址可以是全局变量、局部变量、函数、段(32位处理器中)、模块或任何其他可识别标签的地址。

(2)  在 C++ 表达式中,每一个符号都会根据其类型进行解释。根据符号所指代的对象,它可以解释为整数、数据结构、函数指针或任何其他数据类型。如果符号不对应于任何 C++ 数据类型(例如未经修改的模块名),则会产生语法错误。

若某个符号可能存在​​歧义,请在其前面加上模块名称和一个感叹号(!)。如果符号名称可以解释为十六进制数,请在其前面加上模块名称和一个感叹号(!) ,或者只加上一个感叹号。要指定某个符号是局部符号,请省略模块名称,并在符号名称前面加上美元符号和感叹号($!) 。有关符号解释的更多信息,请参阅“符号语法”和“符号匹配”。

4.  表达式中的运算符

每一种表达式类型都使用不同的运算符集合。

有关 MASM 表达式中可使用的运算符及其优先级规则的更多信息,请参阅“MASM 数和运算符”。

    有关 C++ 表达式中可使用的运算符及其优先级规则的更多信息,请参阅“C++ 数和运算符”。

    请记住,MASM 操作始终基于字节,而 C++ 操作遵循 C++ 类型规则(包括指针运算的缩放)

    有关不同语法的示例,请参阅“混合表达式示例”。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值