本节讨论如何使用 dbx 对变量和表达式求值。
如果不确定 dbx 对其求值的变量,可使用 which 命令查看 dbx 使用的全限定名。
要查看在其中定义变量名的其他函数和文件,请使用 whereis 命令。
有关这些命令的信息,请参见which 命令 和whereis 命令。
要对当前函数的作用域之外的变量进行求值或监视时,请执行下列操作之一:
限定函数名。请参见使用作用域转换操作符限定符号。例如:
(dbx) print ‘item
通过更改当前函数来访问该函数。请参见导航到代码。
表达式应遵循当前语言的语法,但 dbx 中引入以用来处理作用域和数组的元语法除外。
print expression
可以使用 print 命令对 Java 代码中的表达式、局部变量或参数求值。
有关更多信息,请参见print 命令。
在 C++ 中,对象指针有两种类型:静态类型(在源代码中定义)和动态类型(对象进行类型转换之前的状况)。dbx 有时可以提供有关对象的动态类型的信息。
通常情况下,如果对象有虚拟函数表(即 vtable),dbx 便可使用 vtable 中的信息正确地确定对象的类型。
您可以将 print 命令、display 命令或 watch 命令与 -r(递归)选项结合使用。dbx 将显示通过类直接定义的所有数据成员以及从基类继承的所有数据成员。
这些命令还可采用 -d 或 +d 选项,切换 dbxenv 变量 output_dynamic_type 的缺省行为。
使用 -d 标志或将 dbxenv 变量 output_dynamic_type 设置为 on 时,如果没有进程运行,则将生成 program is not active 错误消息。同样,当您正在调试信息转储文件时,如果没有进程,则无法访问动态信息。如果尝试通过虚拟继承来查找动态类型,将生成 illegal cast on class pointers 错误消息。在 C++ 中,从虚拟基类转换到派生类是非法的。
在 C++ 中,可以定义带有未命名参数的函数。例如:
void tester(int) { }; main(int, char **) { tester(1); };
虽然未命名参数不能在程序中的其他地方使用,但是编译器会按某种格式对未命名参数进行编码,让您可以对其求值。该格式如下(这里,编译器为 %n 赋整数值):
_ARG%n
要获取由编译器分配的函数名称,请使用 whatis 命令,并用函数名称作为其目标。
(dbx) whatis tester void tester(int _ARG1); (dbx) whatis main int main(int _ARG1, char **_ARG2);
有关更多信息,请参见whatis 命令。
(dbx) print _ARG1 _ARG1 = 4
解除指针引用时,请查看该指针指向的容器的内容。
解除指针引用时,dbx 会在命令窗格中显示求值;在下面的示例中,即由 t 指向的值:
(dbx) print *t *t = { a = 4 }
监视每次程序停止时表达式的值是一种了解特定表达式或变量的变化情况和变化时间的有效方法。 display 命令可指示 dbx 监视一个或多个指定的表达式或变量。监视会一直持续进行,直至使用 undisplay 命令将其停止为止。watch 命令用于在每个停止点处以相应点的当前作用域对表达式求值并进行输出。
使用 display 命令显示每次程序停止时变量或表达式的值:
display expression, ...
一次可以监视不止一个变量。如果 display 命令不带选项,则将输出显示的所有表达式的列表。
有关更多信息,请参见display 命令。
watch expression, ...
有关更多信息,请参见watch 命令。
dbx 会一直显示监视的变量值,直至使用 undisplay 命令停止显示为止。 可以停止指定的表达式的显示,也可以停止当前监视的所有表达式的显示。
undisplay expression
undisplay 0
有关更多信息,请参见undisplay 命令。