【问题标题】:Debugging with gdb and gfortran - FPE's使用 gdb 和 gfortran 进行调试 - FPE
【发布时间】:2015-07-01 14:50:13
【问题描述】:

我正在调试一个已添加到其中的更大的数值程序。它是用 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 的正确标志是什么,以确保程序在遇到浮点异常时停止运行(最好使用回溯)?我尝试按照here 的说明进行操作,但似乎没有任何改变。

【问题讨论】:

标签: gdb fortran fortran90 gfortran


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-07
    • 2021-03-17
    • 2011-05-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-11
    相关资源
    最近更新 更多