Sun Studio 12:Fortran 编程指南

6.4 调试 IEEE 异常

定位异常出现的位置需要启用异常捕获。这可以通过使用 -ftrap=common 选项(用 f95 编译器编译时的缺省选项)进行编译,或通过使用 ieee_handler() 建立异常处理程序例程来完成。启用了异常捕获,便可从 dbx 中运行程序,使用 dbx catch FPE 命令来查看出错位置。

使用 -ftrap=common 编译的优点是:无需修改源代码即可捕获异常。但是,通过调用 ieee_handler(),您可以更有选择性地查看异常。

示例:dbx 的编译及使用:


demo% f95 -g myprogram.f
demo% dbx a.out
Reading symbolic information for a.out
...
(dbx) catch FPE
(dbx) run
Running: a.out
(process id 19739)
signal FPE (floating point divide by zero) in MAIN at line 212 in file "myprogram.f"
  212               Z = X/Y
(dbx)  print Y
y = 0.0
(dbx)

如果发现程序因上溢和其他异常而终止,可调用 ieee_handler() 明确定位第一处上溢,以便只捕获上溢。这至少需要修改主程序的源代码,如下例所示。

示例:在其他异常出现时定位上溢:


demo% cat myprog.F
#include “floatingpoint.h”
        program myprogram
...
      ier = ieee_handler(”set’,’overflow’,SIGFPE_ABORT)
...
demo% f95 -g myprog.F
demo% dbx a.out
Reading symbolic information for a.out
...
(dbx) catch FPE
(dbx) run
Running: a.out
(process id 19793)
signal FPE (floating point overflow) in MAIN at line 55 in file "myprog.F"
   55               w = rmax * 200.                     ! Cause of the overflow
(dbx) cont                                   ! Continue execution to completion
execution completed, exit code is 0
(dbx)

为了具有选择性,此示例引入了 #include,它需要以 .F 后缀重命名源文件,并调用 ieee_handler()。您可更深入一层,创建出现上溢异常时要调用的自己的处理程序函数,执行一些应用程序特定的分析,并在中止前打印中间结果或调试结果。