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.  查看和导航到代码

5.  控制程序执行

运行程序

dbx 连接到正在运行的进程

从进程中分离 dbx

单步执行程序

单步执行

步入函数

继续执行程序

在指定行恢复程序执行

调用函数

调用安全性

使用 Ctrl+C 停止进程

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 支持两个基本单步执行命令:nextstep,外加 step 命令的两个变体(称为 step upstep to)。nextstep 这两个命令均使程序于再次停止前执行一个源代码行。

如果执行的行中包含函数调用,next 命令允许执行调用并于下一行停止(“步过”调用)。step 命令停止在被调用函数的第一行(“步入”调用)。

step up 命令会在步入函数之后,将程序返回到调用方函数。

step to 命令会尝试步入当前源代码行中的指定函数;如果未指定任何函数,则尝试步入由当前源代码行的汇编代码确定调用的最后一个函数。可能会因为条件转移或当前源代码行内没有被调用的函数,而无法执行函数调用。在这些情况下,step to 命令将步过当前源代码行。

有关 nextstep 命令的更多信息,请参见next 命令step 命令

单步执行

要单步执行指定行数的代码,请使用 dbxnextstep 命令,并在命令后跟要执行代码的行数 [n]

(dbx) next n

(dbx) step n

step_granularity 环境变量确定 step 命令和 next 命令单步执行代码的单元(请参见设置 dbx 环境变量)。其单元可以是语句或行。

step_events 环境变量控制步骤中是否启用断点(请参见设置 dbx 环境变量)。

step_abflow 环境变量控制当 dbx 检测到将发生不寻常的控制流更改时,是否停止运行(请参见设置 dbx 环境变量)。对 siglongjmp()longjmp() 的调用或异常抛出有可能导致此类控制流更改。

步入函数

要步入从当前源代码行调用的函数,请使用 step to 命令。例如,要步入函数 GetDiscount(),键入:

step to GetDiscount

要步入最后调用的函数,请键入:

step to

继续执行程序

要继续执行程序,请使用 cont 命令。

(dbx) cont

cont 命令有一个变体 (cont at line_number),它允许指定恢复程序执行的当前程序位置行之外的行。这样可以跳过已知引起问题的一行或多行代码,而无需重新编译。

要在指定行继续执行程序,请键入:

(dbx) cont at 124

行号是相对于程序停止的文件求出的;给定的行号必须位于当前函数的作用域内。

cont at line_number 命令和 assign 命令配合使用,可以避免执行包含某个函数调用(可能会错误地计算某一变量的值)的代码行。

在指定行恢复程序执行

  1. 使用 assign 给变量赋正确的值。
  2. 使用 cont at line_number 来跳过包含不正确地计算值之函数调用的行。

    假定程序停止于第 123 行。第 123 行调用函数 how_fast(),该函数将不正确地计算变量 speed。您知道 speed 变量应该取什么值,因此便为 speed 赋值。然后跳过对 how_fast() 的调用,于第 124 行处继续执行程序。

    (dbx) assign speed = 180; cont at 124;

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

    如果使用带有 when 断点命令的 cont 命令,则程序每次尝试执行第 123 行时,都会跳过对 how_fast() 的调用。

    (dbx) when at 123 { assign speed = 180; cont at 124;}

    有关 when 命令的更多信息,请参见:

调用函数

程序被停止时,可以使用 dbx call 命令调用函数,以此接受必须传递给被调用函数的参数值。

要调用过程,请键入函数名并提供其参数。例如:

(dbx) call change_glyph(1,3)

如果参数是可选项,则必须在 function_name 后键入括号。例如:

(dbx) call type_vehicle()

可以使用 call 命令显式调用函数;或通过求包含函数调用的表达式的值或使用 stop in glyph -if animate() 之类的条件修饰符来隐式调用函数。

C++ 虚拟函数与其他函数一样,可以使用 print 命令或 call 命令(请参print 命令call 命令)或任何其他执行函数调用的命令进行调用。

如果定义函数的源文件已使用 –g 选项编译,或原型声明在当前作用域可见,dbx 会检查参数的个数和类型,如果存在不匹配便发出错误消息。否则, dbx 不会检查参数的个数并继续执行调用。

缺省情况下,在每个 call 命令之后,dbx 都会自动调用 fflush(stdout) 来确保 I/O 缓冲区内存储的所有信息全部被输出。要关闭自动刷新,请将 dbx 环境变量 output_auto_flush 设置为 off

对 C++ 而言,dbx 可处理隐式 this 指针、缺省参数和函数重载。如有可能,C++ 重载函数将自动求解。如果存在任何二义性(例如,未使用 -g 编译函数),dbx 将显示重载名称列表。

使用 call 命令时,dbx 的行为就好像您使用了 next 命令一样(从被调用的函数返回)。但是,如果程序在被调用的函数内遇到断点,dbx 将在断点处停止程序并发出消息。如果现在键入 where 命令,堆栈跟踪将显示调用源自 dbx 命令级。

如果继续执行,调用会正常返回。如果尝试中止、运行、重新运行或调试,当 dbx 试图从嵌套中恢复时,命令便会终止。然后,可以重新发出命令。另外,可以使用 pop -c 命令弹出最近调用之前的所有帧。

调用安全性

通过使用 call 命令或通过输出包含调用的表达式来在要调试的进程中进行调用时,可能会导致不明显的严重中断。以下是一些要密切注意的情况以及摆脱这些情况的方法。

dbx 进行的一些调用会“安全地”执行。如果遇到问题(一般是段故障)而非通常的 "Stopped with call to ...",则 dbx 会:

对于下面的调用,dbx 所使用的是安全调用: