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.  命令参考

索引

查找符号

在程序中,同一名称可能会引用不同类型的程序实体,并可能会在许多作用域中出现。dbx whereis 命令会列出全限定名称,即该名称的所有符号的位置。如果在表达式中给出该名称,则 dbx which 命令会告知 dbx 将使用符号的哪个具体值(请参见which 命令)。

打印符号具体值列表

要输出指定符号的所有具体值的列表,请使用 whereis symbol,其中 symbol 可以是用户定义的任何标识符。例如:

(dbx) whereis table
forward: `Blocks`block_draw.cc`table
function: `Blocks`block.cc`table::table(char*, int, int, const point&)
class: `Blocks`block.cc`table
class: `Blocks`main.cc`table
variable:       `libc.so.1`hsearch.c`table

输出内容包括程序在其中定义 symbol 的可装入对象的名称,以及每个对象的实体类型:类、函数或变量。

由于 dbx 符号表中的信息是在需要时才读入,因此 whereis 命令只记录已装入符号的具体值。随着调试会话越来越长,具体值列表也会增长(请参见目标文件和可执行文件中的调试信息)。

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

确定 dbx 使用哪个符号

如果在表达式中指定了名称(没有完全限定),则 which 命令会告知 dbx 使用哪个具有给定名称的符号。例如:

(dbx) func
wedge::wedge(char*, int, int, const point&, load_bearing_block*)
(dbx) which draw
`block_draw.cc`wedge::draw(unsigned long)

如果指定的符号名不在局部作用域中,则 which 命令会沿着作用域转换搜索路径搜索该符号的第一个具体值。如果 which 找到该名称,则它会报告全限定名称。

如果搜索操作在搜索路径中的任何位置找到了 symbol 的处于同一作用域级别的多个具体值,则 dbx 会在命令窗格中打印一条消息,报告这种不明确情况。

(dbx) which fid
More than one identifier `fid’.
Select one of the following:
 0) Cancel
 1) `example`file1.c`fid
 2) `example`file2.c`fid

dbx 会显示重载信息,并列出二义符号名。在 which 命令的上下文中,从具体值列表中进行选择不会影响 dbx 或程序的状态。无论选择哪个具体值,dbx 都会回显名称。

如果使 symbol(本例中为 block)成为必须对 symbol 运行的某个命令(例如,print 命令)的参数,则 which 命令会让您预览将发生的事情。如果有二义名,重载显示列表会指明 dbx 尚未记录它会使用两个或更多名称中的哪一个具体值。dbx 会列出可能的值,等待您从中选择一个。有关 which 命令的更多信息,请参见which 命令

作用域转换搜索路径

当您发出包含表达式的调试命令时,将按以下顺序查找表达式中的符号。dbx 会按编译器在当前访问作用域中进行操作的同样方式解析这些符号。

  1. 在使用当前访问作用域的当前函数的作用域内(请参见访问作用域)。如果程序在嵌套块中停止,则 dbx 会在该块内搜索,然后在所有封装块的作用域中搜索。

  2. 仅限于 C++: 当前函数的类及其基类的类成员。

  3. 仅限于 C++: 当前名字空间。

  4. 当前函数的参数。

  5. 立即封装模块,通常为包含当前函数的文件。

  6. 供此共享库或可执行文件专用的符号。可使用链接程序作用域来创建这些符号。

  7. 主程序的全局符号,然后为共享库的全局符号。

  8. 如果上述搜索都不成功,则 dbx 会假定您正在引用其他文件中的专用或文件静态变量或函数。dbx 可选择根据 dbxenv 设置 scope_look_aside 的值在每个编译单元中搜索文件静态符号。

无论 dbx 使用符号的哪个具体值,它都会先沿此搜索路径查找。如果 dbx 找不到符号,它会报告错误。

放宽作用域查找规则

要为静态符号和 C++ 成员函数放宽作用域查找规则,请将 dbx 环境变量 scope_look_aside 设置为 on:

dbxenv scope_look_aside on

或者,使用“双反引号”前缀:

stop in ``func4            func4 may be static and not in scope

如果将 dbx 环境变量 scope_look_aside 设置为 on,则 dbx 会查找:

which 命令会告知您 dbx 选择哪个符号。如果有二义名,重载显示列表会指明 dbx 尚未确定它会使用两个或更多名称中的哪一个具体值。dbx 会列出可能的值,等待您从中选择一个。

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