解释gfortran错误追溯

时间:2017-10-10 00:21:29

标签: linux bash debugging fortran gfortran

我正在运行由其他人编写的Fortran 77程序。我在Linux上使用gfortran编译器(v5.4.0)(Ubuntu v.16.04)。我不是Fortran,gcc或bash脚本的有经验的用户,所以我在这里苦苦挣扎。

当我的程序运行完毕后,我收到以下消息:

Note: The following floating-point exceptions are signalling: IEEE_DENORMAL

我不得不查看它 - 我知道我的一些浮点数需要存储为“非正规”,这是一种非常小数字的低精度形式(而不是将它们刷新为零)。这些来自程序中不稳定的空气动力学计算 - 我在进行计算时看到了这一点。这些非正规数量不太可能对我的结果产生重大影响,但是为了尝试找出发生的位置/原因,我尝试使用以下错误选项进行编译:

gfortran –g –fbacktrace –ffpe-trap=invalid,zero,overflow,underflow,denormal –O3 –mcmodel=medium –o ../program.exe

程序已编译,但在运行时崩溃并返回:

Program received signal SIGFPE: Floating-point exception - erroneous arithmetic operation.

Backtrace for this error:
#0  0x7F442F143E08
#1  0x7F442F142F90
#2  0x7F442EA8A4AF
#3  0x4428CF in subroutine2_ at code.f:3601 (discriminator 3)
#4  0x442C3F in subroutine1_ at code.f:3569
#5  0x4489DA in code_ at code.f:428
#6  0x42BdD1 in MAIN__ at main.f:235
Floating point exception (core dumped)

我可以将这些解释为一个调用层次结构,从6到3反向工作:

* 6。在“main.f”的第235行,出现了问题。 [这是对“code.f”的调用]

* 5。在“code.f”的第428行,出现了问题。 [这是对“code.f”中的“subroutine1”的调用]

* 4。在“code.f”的第3569行,在“子程序1”中,出现了问题。 [这是对“code.f”中的“subroutine2”的调用]

* 3。在“code.f”的第3601行,在“子程序2”中,出现了问题。 [这是条件陈述]

if (windspd_2m.ge.5.0) then...

因此DENORMAL错误必须在“then”操作中发生(我没有包含该代码,因为(a)它涉及一系列长而复杂的依赖关系,并且(b)我可以解开数学错误,它是我正在努力的调试错误。)

但是对于上面的错误2,1,0 ......我不知道如何解释这些数字/字母串。我也不知道“鉴别器3”是什么意思。我用谷歌搜索了这些,但我发现的唯一资源解释了他们假设的知识水平高于我的水平。假设很少有关于Fortran,gcc或bash脚本的预先知识,那么有人可以帮我解释这些错误代码吗?

1 个答案:

答案 0 :(得分:2)

前三个堆栈帧是由于在GFortran运行时库(libgfortran)中实现了回溯。回溯无法象征性地解析动态库中的地址,因此您只能得到地址。如果你想看到符号输出,你可以添加" -static"你的编译选项。

因此,我的第一个猜测是错误发生在code.f:3601,并且由于5.0是常量,因此windspd_2m应该是非正规的。

相关问题