Kee*_*ith 5 linux debugging bash 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)
Run Code Online (Sandbox Code Playgroud)
我可以将这些解释为一个调用层次结构,从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脚本的预先知识很少,那么有人可以帮我解释这些错误代码吗?
前三个堆栈帧是由于 GFortran 运行时库 (libgfortran) 中回溯的实现造成的。回溯无法以符号方式解析动态库中的地址,因此您只能得到地址。如果您想查看符号输出,可以将“-static”添加到编译选项中。
因此,我的第一个猜测是错误位于 code.f:3601,并且由于 5.0 是一个常量,因此 Windspd_2m 应该是非正规的。