Sun Studio 12:使用 dbx 调试程序

系统事件规范

以下是系统事件的事件规范。

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

成功执行 dlopen()() 或 dlclose()() 调用后会发生这些事件。执行 dlopen()() 或 dlclose()() 调用可能会导致装入多个库。预定义变量 $dllist 中总是有这些库的列表。$dllist 中的第一个 shell 字为 "+" 或 "-",表示是要添加还是要删除库列表。

lib-path 是共享库的名称。如果指定该名称,则只在装入或卸载了给定库时才会发生事件。在这种情况下,$dlobj 包含库的名称。$dllist 仍然可用。

如果 lib-path/ 开头,则将执行完整字符串匹配。否则,将只比较路径的尾部。

如果未指定 lib-path,则只要出现 dl 活动,都会发生事件。在这种情况下,$dlobj 为空,但 $dllist 有效。

fault fault

当出现指定的错误时,就会发生 fault 事件。这些错误为体系结构相关式错误。以下这组 dbx 已知的错误在 proc(4) 手册页中进行了定义。

错误 

说明 

FLTILL

非法指令 

FLTPRIV

特权指令 

FLTBPT*

断点陷阱 

FLTTRACE*

跟踪陷阱(单步) 

FLTACCESS

内存访问(如对齐) 

FLTBOUNDS

内存边界(无效地址) 

FLTIOVF

整数溢出 

FLTIZDIV

整数除以零 

FLTPE

浮点异常 

FLTSTACK

无法恢复的栈错误 

FLTPAGE

可恢复的页错误 

FLTWATCH*

监视点陷阱 

FLTCPCOVF

CPU 性能计数器溢出 


注 –

dbx 使用 BPTTRACEBOUNDS 来实现断点和单步执行。处理它们时可能会干扰 dbx 的运行情况。



注 –

FLTBPTFLTTRACE 会被忽略,因为它们会干扰诸如断点和单步执行等 dbx 基本功能(请参见事件安全)。


上述错误摘自 /sys/fault.hfault 可以是上面所列错误中的任何一种(大小写、有无 FLT 前缀均可),也可以是实际的数字代码。


注 –

在 Linux 平台上不能使用 fault 事件。


lwp_exit

退出了 lwp 时,会发生 lwp_exit 事件。$lwp 包含事件处理程序执行期间退出的 LWP(lightweight process,轻量级进程)的 ID。


注 –

在 Linux 平台上不能使用 lwpexit 事件。


sig signal

信号首次传送给所调试的程序时,会发生 sig signal 事件。signal 可以是十进制数或信号名(大小写均可),前缀是可选的。它与 catch 命令和 ignore 命令毫无关系,尽管 catch 命令可按如下方式实现:


function simple_catch {
    when sig $1 {
            stop;
            echo Stopped due to $sigstr $sig
            whereami
    }
}

注 –

收到 sig 事件时,进程尚未检测到它。只有在使用指定的信号继续执行进程时,信号才会传送给它。


sig signal sub-code

首次将具有指定 sub-code 的指定信号传送到子进程时,会发生 sig signal sub-code 事件。与信号相同,可以按十进制数形式或大小写字母形式键入 sub-code,前缀是可选的。

sysin code | name

刚启动了指定的系统调用,且进程已进入内核模式。

dbx 支持的系统调用概念是由陷阱按 /usr/include/sys/syscall.h 中的枚举提供内核系统调用。

这与系统调用的 ABI 概念不同。一些 ABI 系统调用在用户模式下得到部分实现,并且使用非 ABI 内核陷阱。但是,对于大多数普通系统调用(主要异常是信号处理),syscall.h 和 ABI 之间没有区别。


注 –

在 Linux 平台上不能使用 sysin 事件。



注 –

/usr/include/sys/syscall.h 中的一组内核系统调用陷阱属于 Solaris OS 中随发行版本而异的一个专用接口。dbx 接受的陷阱名(代码)和陷阱编号列表包括 dbx 支持的任何 Solaris OS 版本支持的所有陷阱名(代码)和陷阱编号。dbx 支持的名称不太可能与任何 Solaris OS 特定发行版本支持的名称完全一致,而且 syscall.h 中的某些名称可能不可用。任何陷阱编号(代码)均可为 dbx 接受,并可正常使用,但是,如果它与已知的系统调用陷阱不对应,系统会发出警告。


sysout code | name

已完成指定的系统调用,进程即将返回到用户模式。


注 –

在 Linux 平台上不能使用 sysout 事件。


sysin | sysout

如果不使用参数,所有系统调用都会被跟踪。某些 dbx 功能(例如 modify 事件和运行时检查)会导致子进程为其自身目的执行系统调用,并且在被跟踪时显示出来。