2017-10-10 306 views
5

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

当我的程序运行完成后,我得到以下信息:

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...

所以非正规错误必须在“然后”操作中发生(因为(a)它涉及到一个长期,复杂的一系列的依赖我没有将这些代码,(b)我可以解开数学错误,这是我正在努力解决的调试错误)。

但是对于上述错误2,1,0 ...我不知道如何解释这些字符串的数字/字母。我也不知道“鉴别器3”的含义。我搜索了这些,但我发现的唯一资源解释了他们假设的知识水平比我高。任何人都可以帮助我解释这些错误代码,假设Fortran,gcc或bash脚本的知识已经很少了?

+0

您正处在正确的轨道上。你的程序崩溃是因为你用'-ffpe-trap = ...'告诉它在浮点异常时崩溃。前三个堆栈帧很可能是对库或内部函数的调用,它们处理实际的错误处理。我不会太担心这些。 – chw21

+0

好的,谢谢@ chw21!这听起来像进入源代码,并找到denom的来源是解决这个问题的最好方法。有可能在计算中保留denom数字是合理的,这取决于它们在哪里。我会更多地考虑'-ffpe-trap'的控制 - 如果我可以让它产生一个警告而不是崩溃程序会更好。 –

+0

*编辑:“denom”应该是“denormal” –

回答

2

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

因此,我的第一个猜测是错误是在code.f:3601,并且由于5.0是一个常数,因此windspd_2m应该是反规范的。

+0

嗨@janneb,谢谢!我不知道什么是动态图书馆,所以我会去了解一下。我现在试试-static选项。 对于code.f:3601处的错误,您的结论是有道理的,但windpsd_2m是直接从不包含非规范值的天气时间序列中绘制的。因为这是一个条件,我认为这个错误出现在“then”语句中,我在文章中总结为“...”,因为这个块相当大。我想知道是否这是“鉴别器3”的回溯意味着什么......不知何故指示“那么”块的哪个部分是信号传输......这有意义吗? –

+0

好吧,我已经完成了静态与动态链接的作业 - 看起来很重要,很高兴我将它添加到我的知识库中。在编译时加入“-static”确实会为这3帧返回符号输出。但是,输出并不会产生新的信息,因为这些帧是对gsignal,gfortran回溯处理程序和gfortran回溯本身的调用。 因此,错误必须在code.f:3601开始的条件语句内。时间检查我的数学! –