gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 13:59:02 47 4
gpt4 key购买 nike

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

最佳答案

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

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 异常(exception)的(可能是空的)逗号分隔列表: 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

关于gdb - 使用 gdb 和 gfortran 进行调试 - FPE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29823099/

47 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com