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.  控制程序执行

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.  事件管理

事件处理程序

事件安全

创建事件处理程序

操作事件处理程序

使用事件计数器

设置事件规范

断点事件规范

in function

at [filename: ]line_number

at address_expression

infile filename

infunction function

inmember function inmethod function

inclass classname [-recurse | -norecurse]

inobject object-expression [-recurse | -norecurse]

数据更改事件规范

access mode address-expression [, byte-size-expression ]

change variable

cond condition-expression

系统事件规范

dlopen [ lib-path ] dlclose [ lib-path ]

fault fault

lwp_exit

sig signal

sig signal sub-code

sysin code | name

sysout code | name

sysin | sysout

执行进度事件规范

exit exitcode

next

returns

returns function

step

其他事件规范

attach

detach

lastrites

proc_gone

prog_new

stop

sync

syncrtld

thr_create [thread_id ]

thr_exit

throw

throw type

throw -unhandled

throw -unexpected

timer seconds

事件规范修饰符

-if condition

-resumeone

-in function

-disable

-count n -count infinity

-temp

-instr

-thread thread_id

-lwp lwp_id

-hidden

-perm

分析和二义性

使用预定义变量

when 命令有效的变量

$handlerid

when 命令和特定事件有效的变量

事件处理程序示例

为存储到数组成员设置断点

执行简单跟踪

在函数内时启用处理程序 (in function)

确定已执行的行数

确定源代码行执行的指令数

事件发生后启用断点

重放重置应用程序文件

检查程序状态

捕获浮点异常

C.  宏

D.  命令参考

索引

使用预定义变量

有一些只读的 ksh 预定义变量。以下变量始终有效:

变量
定义
$ins
反汇编当前指令。
$lineno
以十进制数表示的当前行号。
$vlineno
以十进制数表示的当前“访问”行号。
$line
当前行的内容。
$func
当前函数名。
$vfunc
当前“访问”函数的名称。
$class
$func 所属类的名称。
$vclass
$vfunc 所属类的名称。
$file
当前文件名。
$vfile
被访问的当前文件的名称。
$loadobj
当前可装入对象的名称。
$vloadobj
被访问的当前可装入对象的名称。
$scope
当前 PC 在反引用符号中的作用域。
$vscope
被访问 PC 在反引用符号中的作用域。
$funcaddr
以十六进制数表示的 $func 地址。
$caller
调用 $func 的函数的名称。
$dllist
在发生 dlopendlclose 事件后,包含刚装入或卸载的装入对象的列表。dllist 的第一个字符根据发生的是 dlopen 还是 dlclose 为 "+" 或 "-"。
$newhandlerid
最近创建的处理程序的 ID。在任何删除处理程序的命令后,此变量有一个未定义的值。创建处理程序后立即使用该变量。dbx 不能针对创建多个处理程序的命令捕获所有处理程序 ID。
$firedhandlers
导致最近中断的处理程序 ID 列表。在 status 命令的输出中,该列表中的处理程序都标记有 "*"。
$proc
正被调试的当前进程的“进程 ID”。
$lwp
当前 LWP 的 Lwp ID。
$thread
当前线程的“线程 ID”。
$newlwp
新建的 LWP 的 lwp ID。
$newthread
新建线程的线程 ID。
$prog
正被调试程序的全路径名。
$oprog
$prog 恢复为 "-" 时的上一个 $prog 值,用于在执行 exec() 后返回到以前调试的内容。$prog 扩展为全路径名时,$oprog 包含命令行中指定的程序路径或指定给 debug 命令的程序路径。如果调用 exec() 多次,则无法返回到原始程序。
$exec32
如果 dbx 二进制数为 32 位,则为 True。
$exitcode
最后运行程序的退出状态。如果进程尚未退出,则该值为空字符串。
$booting
如果在“引导”过程中发生事件,则会设置为 true。每当调试新程序时,它会先引导以便可以确定共享库的列表和位置。然后,进程将被中止。这一序列被称为引导。

引导过程中,所有事件仍然可用。例如,使用此变量来区分在调试运行期间发生的 syncsyncrtld 事件以及在正常运行期间发生的这些事件。

例如,可以这样实现 whereami

function whereami {
  echo Stopped in $func at line $lineno in file $(basename $file)
  echo "$lineno\t$line"
}

when 命令有效的变量

以下变量仅在 when 命令的主体中有效。

$handlerid

在执行主体过程中,$handlerid 是主体所属 when 命令的 ID。下列命令是等价的:

when X -temp { do_stuff; }
when X  { do_stuff; delete $handlerid; }

when 命令和特定事件有效的变量

某些变量仅在 when 命令主体中以及对于下表中所示的特定事件有效。

表 B-1 对 sig 事件有效的变量

变量
说明
$sig
触发事件的信号数
$sigstr
$sig 的名称
$sigcode
$sig 的子代码(如果适用)
$sigcodestr
$sigcode 的名称
$sigsender
信号发出方的进程 ID(如果适用)

表 B-2 对 exit 事件有效的变量

变量
说明
$exitcode
传递给 _exit(2)exit(3) 的参数的值或 main 的返回值

表 B-3 对 dlopendlclose 事件有效的变量

变量
说明
$dlobj
装入对象 dlopened 或 dlclosed 的路径名

表 B-4 对 sysinsysout 事件有效的变量

变量
说明
$syscode
系统调用号
$sysname
系统调用名

表 B-5 对 proc_gone 事件有效的变量

变量
说明
$reason
signal、exit、kill 或 detach 之一

表 B-6 对 thr_create 事件有效的变量

变量
说明
$newthread
新建线程的 ID(例如 t@5
$newlwp
新建 LWP 的 ID(例如 l@4

表 B-7 对 watch 事件有效的变量

变量
说明
$watchaddr
正在写入、读取或执行的地址
$watchmode
以下项之一:r 代表读取,w 代表写入,x 代表执行;后跟以下项之一:a 代表之后,b 代表之前