使用 gdb 和 gfortran 进行调试 - FPE

Debugging with gdb and gfortran - FPE's

我正在调试一个我添加的更大的数值程序。它是用 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 来测试它 - 它不会导致程序停止 运行ning,但会导致意外行为。

gdb 或 gfortran 的正确标志是什么以确保程序在遇到浮点异常时停止 运行ning(最好使用回溯)?我尝试按照说明进行操作 here,但似乎没有任何改变。

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

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



gfortran 手册中编译器标志的解释:

-g       

包括调试数据

-fbacktrace

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

-ffpe-trap=list

指定应引发浮点异常 (FPE) 时的 IEEE 异常列表。在大多数系统上,这将导致发送 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