本节讨论如何使用 dbx 对变量和表达式求值。
如果不确定 dbx 对其求值的变量,可使用 which 命令查看 dbx 使用的全限定名。
要查看在其中定义变量名的其他函数和文件,请使用 whereis 命令。
有关这些命令的信息,请参见which 命令和whereis 命令。
要对当前函数的作用域之外的变量进行求值或监视时,请执行下列操作之一:
限定函数名。请参见使用作用域转换操作符限定符号。例如:
(dbx) print ‘item
通过更改当前函数来访问该函数。请参见导航到代码。
表达式应遵循当前语言的语法,但 dbx 中引入以用来处理作用域和数组的元语法除外。
print expression
可以使用 print 命令对 Java 代码中的表达式、局部变量或参数求值。
有关更多信息,请参见print 命令。
注 - dbx 支持 C++ dynamic_cast 和 typeid 操作符。使用这两个操作符求表达式的值时, dbx 会调用由编译器提供的一些 rtti 函数。如果源代码没有明确使用这些操作符,编译器便不会生成这些函数,因此 dbx 将无法求表达式的值。
在 C++ 中,对象指针有两种类型:静态类型(在源代码中定义)和动态类型(对象进行类型转换之前的状况)。dbx 有时可以提供有关对象的动态类型的信息。
通常情况下,如果对象有虚拟函数表(即 vtable),dbx 便可使用 vtable 中的信息正确地确定对象的类型。
可以在 print 命令、display 命令或 watch 命令中使用 -r(递归)选项。此时 dbx 将显示通过类直接定义的所有数据成员以及从基类继承的所有数据成员。
在这些命令中还可使用 -d 或 +d 选项,用来切换 dbx 环境变量 output_derived_type 的缺省行为。
如果在没有运行进程时使用 -d 标志或将 dbx 环境变量 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 expression, ...
一次可以监视不止一个变量。如果使用的 display 命令不带选项,将输出显示的所有表达式的列表。
有关更多信息,请参见display 命令。
要监视每个停止点处表达式 expression 的值,请键入:
watch expression, ...
有关更多信息,请参见watch 命令。
dbx 会一直显示监视的变量值,直至使用 undisplay 命令关闭显示为止。可以关闭指定的表达式的显示,也可以关闭当前监视的所有表达式的显示。
undisplay expression
undisplay 0
有关更多信息,请参见undisplay 命令。