使用gdb和gfortran进行调试 - FPE's

14

我正在调试一个我添加进去的大型数值程序。该程序用fortran90编写,使用gfortran编译(Mac上可用的最新版本),我正在使用gdb进行调试(同样是Mac上可用的最新版本)。

我的修改中存在一个错误,我正在尝试定位它,因为运行程序并未产生预期结果。当我在gdb中运行它时,最后得到以下输出:

Note: The following floating-point exceptions are signalling: IEEE_INVALID_FLAG IEEE_DIVIDE_BY_ZERO IEEE_UNDERFLOW_FLAG IEEE_DENORMAL [Inferior 1 (process 83843) exited normally]

我想确定这个FPE确切发生的位置,但似乎浮点异常不会导致程序崩溃。我通过在代码中明确除以0来测试了这一点-它没有导致程序停止运行,但导致了意外的行为。

无论是gdb还是gfortran,怎样才能确保程序在遇到浮点异常时停止运行(最好带有回溯)?我尝试按照这里的说明进行操作,但似乎没有改变任何内容。


1
在 https://stackoverflow.com/questions/10210759/gfortran-warn-on-floating-point-exception 中提到了编译器标志可能会有所帮助。但是,您能否在问题中提及版本号?“最新版本”对未来的读者来说没有太大用处。 - francescalus
1个回答

15

可能需要在编译代码时添加这些标志:

gfortran -g -fbacktrace -ffpe-trap=zero,overflow,underflow youcode.f90 -o run.exe

说明来自gfortran手册的编译器标志:
-g       

包括调试数据

-fbacktrace

指定当遇到运行时错误或发出致命信号(分段错误、非法指令、总线错误或浮点异常)时,Fortran 运行库应输出错误的回溯信息。此选项仅对 Fortran 主程序的编译产生影响。

-ffpe-trap=list

指定 IEEE 异常列表,当出现浮点异常 (FPE) 时应该引发。在大多数系统上,这将导致发送 SIGFPE 信号并中断程序,生成一个有用于调试的核心文件。list 是以下 IEEE 异常的 (可能为空的) 逗号分隔列表: invalid (无效的浮点操作,如 SQRT(-1.0))、zero (除零)、overflow (浮点操作溢出)、underflow (浮点操作下溢)、precision (操作期间精度丢失) 和 denormal (操作产生了一个非规格化值)。 Fortran 运行时库中的一些例程,例如 'CPU_TIME',在使用 ffpe-trap=precision 时很可能触发浮点异常。因此,不建议使用 ffpe-trap=precision。 请查看这两个位置以获取更多信息:

https://gcc.gnu.org/onlinedocs/gcc-4.3.2/gfortran.pdf http://faculty.washington.edu/rjl/uwamath583s11/sphinx/notes/html/gfortran_flags.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接