使用要求进行浮点计算的代码编程的程序员经常需要调试程序中生成的异常。当出现被零除或上溢之类的浮点异常时,系统会返回一个合理的答案,作为导致异常的操作的结果。返回合理答案后,程序会继续安静地执行。Solaris 操作系统实现了异常合理答案的“IEEE 二进制浮点运算标准”定义。
因为返回了浮点异常的合理答案,所以异常不会自动触发信号 SIGFPE。缺省情况下,某些整数异常(如整数被零除和整数上溢)会触发信号 SIGFPE。
要查找导致异常的原因,需要在程序内设置陷阱处理程序,以使异常触发 SIGFPE 信号。(请参见 ieee_handler(3m) 手册页中的陷阱处理程序示例。)
可使用下列方式启用陷阱:
ieee_handler
fpsetmask(请参见 fpsetmask(3c) 手册页)
-ftrap 编译器标志(对于 Fortran 95 而言;请参见 f95(1) 手册页)
使用 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》(《数值计算指南》)。