定位异常出现的位置需要启用异常捕获。这可以通过使用 -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() 明确定位第一处上溢,以便只捕获上溢。这至少需要修改主程序的源代码,如下例所示。
为了具有选择性,此示例引入了 #include,它需要以 .F 后缀重命名源文件,并调用 ieee_handler()。您可更深入一层,创建出现上溢异常时要调用的自己的处理程序函数,执行一些应用程序特定的分析,并在中止前打印中间结果或调试结果。