JavaScript is required to for searching.
跳过导航链接
退出打印视图
Oracle Solaris Studio 12.3:使用 dbx 调试程序     Oracle Solaris Studio 12.3 Information Library (简体中文)
search filter icon
search icon

文档信息

前言

1.  dbx 入门

2.  启动 dbx

3.  定制 dbx

4.  查看和导航到代码

导航到代码

导航到文件

导航到函数

从 C++ 二义函数名称列表中选择

在多个具体值中进行选择

打印源码列表

在调用堆栈中移动以导航到代码

程序位置的类型

程序作用域

反映当前作用域的变量

访问作用域

访问作用域的组件

更改访问作用域

使用作用域转换操作符限定符号

反引号操作符

C++ 双冒号作用域转换操作符

块局部操作符

链接程序名

查找符号

打印符号具体值列表

确定 dbx 使用哪个符号

作用域转换搜索路径

放宽作用域查找规则

查看变量、成员、类型和类

查找变量、成员和函数的定义

查找类型和类的定义

目标文件和可执行文件中的调试信息

目标文件装入

列出模块的调试信息

列出模块

查找源文件和目标文件

5.  控制程序执行

6.  设置断点和跟踪

7.  使用调用堆栈

8.  求值和显示数据

9.  使用运行时检查

10.  修复并继续

11.  调试多线程应用程序

12.  调试子进程

13.  调试 OpenMP 程序

14.  处理信号

15.  使用 dbx 调试 C++

16.  使用 dbx 调试 Fortran

17.  使用 dbx 调试 Java 应用程序

18.  在机器指令级调试

19.  将 dbx 与 Korn Shell 配合使用

20.  调试共享库

A.  修改程序状态

B.  事件管理

C.  宏

D.  命令参考

索引

使用作用域转换操作符限定符号

使用 funcfile 命令时,可能需要使用作用域转换操作符来限定作为目标给出的函数的名称。

dbx 提供了三个用于限定符号的作用域转换操作符:反引号操作符 (`)、C++ 双冒号操作符 (::) 和块局部操作符 (:lineno)。应单独使用它们,在某些情况下可以一起使用。

除了在代码中导航时限定文件名和函数名外,输出和显示作用域外变量和表达式以及显示类型和类声明时还必须限定符号名(使用 whatis 命令)。在所有情况下,符号限定规则都是相同的;本节介绍所有类型的符号名限定的规则。

反引号操作符

使用反引号字符 (`) 可查找全局作用域变量或函数:

(dbx) print `item

一个程序可以在两个不同的文件(或编译模块)中使用同一函数名。在这种情况下,还必须将函数名限定到 dbx,以便它记录您要导航的函数。要按相应的文件名限定函数名,请使用通用反引号 (`) 作用域转换操作符。

(dbx) func`file_name`function_name

C++ 双冒号作用域转换操作符

使用双冒号操作符 (::) 可以用以下名称限定具有全局作用域的 C++ 成员函数、顶级函数或变量:

可能需要限定重载函数名。如果不限定它,则 dbx 会显示一个重载列表,以便您从中选择要导航的函数。如果您知道函数类名,则可以将其与双冒号作用域转换操作符一起使用来限定名称。

(dbx) func class::function_name (args)

例如,如果 hand 是类名,而 draw 是函数名,请键入:

(dbx) func hand::draw

块局部操作符

使用块局部操作符 (: line_number) 可专门引用嵌套块中的变量。如果有遮蔽参数或成员名的局部变量,或如果有几个块,其中每个块都有其自己的局部变量版本,可能需要这样做。line_number 是相关变量所对应的块内第一行代码的号码。当 dbx 使用块局部操作符限定局部变量时,dbx 会使用第一个代码块的行号,但您可以在 dbx 表达式中使用作用域内的任意行号。

在下例中,块局部操作符 (:230) 与反引号操作符配合使用。

(dbx) stop in `animate.o`change_glyph:230`item

下例显示了当函数中有多个具体值时,dbx 如何对使用块局部操作符限定的变量名求值。

(dbx) list 1,$
    1   #include <stddef.h>
    2
    3   int main(int argc, char** argv) {
    4
    5   int i=1;
    6
    7       {
    8            int i=2;
    9            {
   10                   int j=4;
   11                   int i=3;
   12                   printf("hello");
   13            }
   14            printf("world\n");
   15       }
   16       printf("hi\n");
   17   }
   18
(dbx) whereis i
variable: `a.out`t.c`main`i
variable: `a.out`t.c`main:8`i
variable: `a.out`t.`main:10`i
(dbx) stop at 12 ; run
...
(dbx) print i
i = 3
(dbx) which i
`a.out`t.c`main:10`i
(dbx) print `main:7`i
`a.out`t.c`main`i = 1
(dbx) print `main:8`i
`a.out`t.c`main:8`i = 2
(dbx) print `main:10`i
`a.out`t.c`main:10`i = 3
(dbx) print `main:14`i
`a.out`t.c`main:8`i = 2
(dbx) print `main:15`i
`a.out`t.c`main`i = 1

链接程序名

dbx 提供了一种按链接程序名(在 C++ 中为改编名称)查找符号的特殊语法。使用 #(磅符号)字符作为符号名的前缀(在任何 $(美元符号)字符前使用 ksh 转义符 \(反斜线)),如以下示例中所示:

(dbx) stop in #.mul
(dbx) whatis #\$FEcopyPc
(dbx) print `foo.c`#staticvar