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

启动调试会话

调试信息转储文件

在相同的操作环境中调试信息转储文件

如果信息转储文件被截断

调试不匹配的信息转储文件

消除共享库问题

注意事项

使用进程 ID

dbx 启动序列

设置启动属性

将编译时目录映射到调试时目录

设置 dbx 环境变量

创建自己的 dbx 命令

编译调试程序

使用 -g 选项进行编译

使用独立的调试文件

创建独立的调试文件

调试优化代码

参数与变量

内联函数

编译时未使用 -g 选项的代码

共享库要求使用 -g 选项以获得完全 dbx 支持

完全剥离的程序

退出调试

停止进程执行

dbx 中分离进程

中止程序而不终止会话

保存和恢复调试运行

使用 save 命令

将系列调试运行另存为检查点

恢复已保存的运行

使用 replay 保存和恢复

3.  定制 dbx

4.  查看和导航到代码

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 对调试“不匹配的”核心转储文件(例如,运行其他版本或修补程序级别的 Solaris 操作系统的系统上生成的核心转储文件)具有有限的支持。


注 - dbx 无法像对待本机代码那样通过信息转储文件来指明 Java 应用程序的状态。


在相同的操作环境中调试信息转储文件

要调试信息转储文件,请键入:

$ dbx program_name core

$ dbxtool program_name core

如果键入以下命令,dbx 会通过信息转储文件确定 program_name

$ dbx - core

$ dbxtool - core

如果 dbx 已在运行,也可以使用 debug 命令调试信息转储文件。

(dbx) debug -c core program_name

可以用 - 替换程序名,dbx 将尝试从信息转储文件中提取程序名。如果在信息转储文件中未提供可执行文件的全路径名,则 dbx 可能找不到可执行文件。如果 dbx 找不到可执行文件,请在指示 dbx 装入信息转储文件时指定二进制文件的完整路径名。

如果信息转储文件不在当前目录下,可指定它的路径名(例如,/tmp/core)。

使用 where 命令(请参见where 命令)确定程序在进行核心转储时的执行位置。

调试信息转储文件时,也可以求变量和表达式的值来查看程序崩溃时的值,但不能求调用函数的表达式的值。无法单步执行。可以设置断点,然后重新运行程序。

如果信息转储文件被截断

如果装入信息转储文件时存在问题,请检查是否有被截断的信息转储文件。如果在创建信息转储文件时将其最大允许大小设得太低,那么 dbx 将无法读取最终被截断的信息转储文件。在 C shell 中,可使用 limit 命令来设置允许的最大信息转储文件大小(请参见 limit(1) 手册页)。在 Bourne shell 和 Korn shell 中,应使用 ulimit 命令(请参见 limit(1) 手册页)。可以在 shell 启动文件中更改信息转储文件大小的限制,重新寻找启动文件,然后重新运行生成该信息转储文件的程序,以生成完整的信息转储文件。

如果信息转储文件不完整并且缺少堆栈段,则堆栈跟踪信息不可用。如果缺少运行时链接程序信息,则装入对象列表不可用。在这种情况下,您会收到 librtld_db.so 未初始化的错误消息。如果缺少 LWP 列表,则线程信息、lwp 信息或堆栈跟踪信息不可用。如果运行 where 命令,将看到一条错误消息,指出程序未处于“活动状态”。

调试不匹配的信息转储文件

有时信息转储文件在一个系统(核心主机)上创建,而您想在另一台机器(dbx 主机)上装入该信息转储文件。但这样做可能会引起两个与库有关的问题:

用户库和系统库可随着修补程序以及主要的 Solaris 操作环境升级而改变,因此如果在收集信息转储文件之后但在信息转储文件上运行 dbx 之前安装修补程序,此问题仍会出现在同一台主机上。

当装入“不匹配”的信息转储文件时,dbx 可能会显示以下一条或多条错误消息:

dbx: core file read error: address 0xff3dd1bc not available
dbx: warning: could not initialize librtld_db.so.1 -- trying libDP_rtld_db.so
dbx: cannot get thread info for 1 -- generic libthread_db.so error
dbx: attempt to fetch registers failed - stack corrupted
dbx: read of registers from (0xff363430) failed -- debugger service failed

消除共享库问题

消除库问题和调试“不匹配的”信息转储文件

  1. dbx 环境变量 core_lo_pathmap 设置为 on
  2. 使用 pathmap 命令告知 dbx 信息转储文件的正确库的位置。
  3. 使用 debug 命令装入程序和信息转储文件。

    例如,假定核心主机的根分区已通过 NFS 导出,并且可以通过 dbx 主机上的 /net/core-host/ 访问,应使用以下命令装入 prog 程序和 prog.core 信息转储文件来进行调试:

    (dbx) dbxenv core_lo_pathmap on
    (dbx) pathmap /usr /net/core-host/usr
    (dbx) pathmap /appstuff /net/core-host/appstuff
    (dbx) debug prog prog.core

    如果没有导出核心主机的根分区,则必须手动复制这些库。不需要重新创建符号链接。(例如,您不必建立从 libc.solibc.so.1 的链接,只需确保 libc.so.1 可用即可)。

注意事项

调试不匹配的信息转储文件时应注意: