使用 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
我正在调试一个我添加的更大的数值程序。它是用 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