Oracle® Developer Studio 12.5:使用 dbx 调试程序

退出打印视图

更新时间: 2016 年 6 月
 
 

求变量和表达式的值

本节讨论如何使用 dbx 对变量和表达式求值。

验证 dbx 使用的变量

如果不确定 dbx 对其求值的变量,可使用 which 命令查看 dbx 使用的全限定名。

要查看在其中定义变量名的其他函数和文件,请使用 whereis 命令。

有关这些命令的信息,请参见which 命令whereis 命令

当前函数作用域之外的变量

输出变量、表达式或标识符的值

表达式应遵循当前语言的语法,但 dbx 中引入以用来处理作用域和数组的元语法除外。

使用输出命令可对本地代码中的变量或表达式求值:

print expression

可以使用 print 命令对 Java 代码中的表达式、局部变量或参数求值。

有关更多信息,请参见print 命令


注 -  dbx 支持 C++ dynamic_casttypeid 操作符。使用这两个操作符求表达式的值时,dbx 会调用由编译器提供的一些运行时类型识别函数。如果源代码没有明确使用这些操作符,编译器便不会生成这些函数,因此 dbx 将无法求表达式的值。

输出 C++ 指针

在 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++ 程序中未命名参数求值

在 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 命令可监视每个停止点处的表达式的值:

watch expression, ...

有关更多信息,请参见watch 命令

停止显示(取消显示)

dbx 会一直显示监视的变量值,直至使用 undisplay 命令停止显示为止。 可以停止指定的表达式的显示,也可以停止当前监视的所有表达式的显示。

要停止特定变量或表达式的显示:

undisplay expression

要停止显示当前监视的所有变量:

undisplay 0

有关更多信息,请参见undisplay 命令