我正在运行由其他人编写的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脚本的知识已经很少了?
您正处在正确的轨道上。你的程序崩溃是因为你用'-ffpe-trap = ...'告诉它在浮点异常时崩溃。前三个堆栈帧很可能是对库或内部函数的调用,它们处理实际的错误处理。我不会太担心这些。 – chw21
好的,谢谢@ chw21!这听起来像进入源代码,并找到denom的来源是解决这个问题的最好方法。有可能在计算中保留denom数字是合理的,这取决于它们在哪里。我会更多地考虑'-ffpe-trap'的控制 - 如果我可以让它产生一个警告而不是崩溃程序会更好。 –
*编辑:“denom”应该是“denormal” –