Oracle Solaris Studio 12.2:使用 dbx 调试程序

捕获信号

缺省情况下,捕获列表包含 33 个以上可检测信号中的许多信号。(信号数目取决于操作系统和版本。)可通过从缺省捕获列表中添加或删除信号来更改缺省捕获列表。


注 –

dbx 接受的信号名称列表中包括 dbx 支持的各种版本 Solaris 操作环境所支持的所有信号。因此,dbx 可能接受当前正在运行的 Solaris 操作环境版本所不支持的信号。例如,dbx 可能接受 Solaris 9 OS 所支持的信号,即使当前运行的是 Solaris 7 OS。有关当前正在运行的 Solaris 操作系统所支持的信号列表,请参见 signal(3head) 手册页。


要查看当前正在捕获的那些 信号的列表,请键入不带 signal 参数的 catch


(dbx) catch

要查看当前即使被程序检测到也会被 dbx 忽略的信号列表,请键入不带 signal 参数的 ignore


(dbx) ignore

更改缺省信号列表

通过将信号名从一个列表移到另一个列表,可以控制由哪些信号导致程序停止。要移动信号名,将当前出现于某个列表的信号名作为参数提供给另一个列表即可。

例如,要将捕获列表中的 QUITABRT 信号移到忽略列表中:


(dbx) ignore QUIT ABRT

捕获 FPE 信号(仅限 Solaris 平台)

使用要求进行浮点计算的代码编程的程序员经常需要调试程序中生成的异常。当出现被零除或上溢之类的浮点异常时,系统会返回一个合理的答案,作为导致异常的操作的结果。返回合理答案后,程序会继续安静地执行。Solaris 操作系统实现了异常合理答案的“IEEE 二进制浮点运算标准”定义。

因为返回了浮点异常的合理答案,所以异常不会自动触发信号 SIGFPE。缺省情况下,某些整数异常(如整数被零除和整数上溢)会触发信号 SIGFPE

要查找导致异常的原因,需要在程序内设置陷阱处理程序,以使异常触发 SIGFPE 信号。(请参见 ieee_handler(3m) 手册页中的陷阱处理程序示例。)

可使用下列方式启用陷阱:

使用 ieee_handler 命令设置陷阱处理程序时,将设置硬件浮点状态寄存器中的陷阱启用掩码。此陷阱启用掩码会导致异常在运行时引发 SIGFPE 信号。

在编译含有该陷阱处理程序的程序后,将该程序装入 dbx。必须首先将 FPE 添加到 dbx 信号捕获列表中,才能捕获 SIGFPE 信号。


(dbx) catch FPE

缺省情况下,FPE 位于忽略列表中。

确定发生异常的位置

FPE 添加到捕获列表后,在 dbx 中运行程序。当出现要捕获的异常时,将引发 SIGFPE 信号,并且 dbx 会停止程序。然后,可以使用 dbx where 命令跟踪调用栈,以帮助查找程序中发生该异常的特定行号(请参见where 命令)。

确定导致异常的原因

要确定导致异常的原因,请使用 regs -f 命令显示浮点状态寄存器 (floating point state register, FSR)。查看寄存器的已产生的异常 (aexc) 和当前异常 (cexc) 字段,这些字段包含下列浮点异常条件位:

有关浮点状态寄存器的更多信息,请参见版本 8 (V8) 或版本 9 (V9) 的《SPARC Architecture Manual》(《SPARC 体系结构手册》)。有关更多讨论和示例,请参见《Numerical Computation Guide》(《数值计算指南》)。