首页 文章

使用gdb和gfortran进行调试 - FPE

提问于
浏览
11

我正在调试我添加的更大的数字程序 . 它是用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但它似乎没有改变任何东西 .

1 回答

  • 12

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

    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 (运算产生非正规值) . 当使用ffpe-trap = precision时,Fortran运行时库中的一些例程(如“CPU_TIME”)可能会触发浮点异常 . 因此,不建议使用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

相关问题