解释 gfortran 错误回溯
Interpreting gfortran error traceback
我是运行别人写的Fortran 77程序。我在 Linux (Ubuntu v.16.04) 上使用 gfortran 编译器 (v5.4.0)。我不是 Fortran、gcc 或 bash 脚本的经验丰富的用户,所以我在这里挣扎。
当我的程序完成 运行 时,我收到以下消息:
Note: The following floating-point exceptions are signalling: IEEE_DENORMAL
我不得不查一下 - 我知道我的一些浮点数需要存储 "denormal",这是一种用于非常小的数字的低精度形式(而不是将它们清零)。这些来自程序中不稳定的空气动力学计算——我在手写计算时看到了这一点。这些非正规数量不太可能显着影响我的结果,但为了尝试找出 where/why 这种情况正在发生,我尝试使用以下错误选项进行编译:
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 行,在 "subroutine1" 中,出现了问题。 [这是 "code.f" 中对 "subroutine2" 的调用]
*3。在 "code.f" 的第 3601 行,在 "subroutine2" 中,出现了问题。 [这是条件语句]
if (windspd_2m.ge.5.0) then...
所以 DENORMAL 错误一定发生在 "then" 操作中(我没有包含该代码,因为 (a) 它涉及一系列长而复杂的依赖关系,并且 (b) 我可以解开数学错误,这是我正在努力解决的调试错误。
但是对于上面的错误2,1,0...我不知道如何解释numbers/letters这些字符串。我也不知道 "discriminator 3" 是什么意思。我用谷歌搜索了这些,但我发现的唯一资源是在假设比我拥有更高水平的知识的情况下解释它们。假设对 Fortran、gcc 或 bash 脚本编制知之甚少,谁能帮我解释这些错误代码?
前三个堆栈帧是由于在 GFortran 运行时库 (libgfortran) 中实现了回溯。回溯无法以符号方式解析动态库中的地址,因此您只能获得地址。如果你想看到符号输出,你可以在你的编译选项中添加“-static”。
因此我的第一个猜测是错误在 code.f:3601,并且由于 5.0 是一个常数,因此 windspd_2m 应该是非正规的。
我是运行别人写的Fortran 77程序。我在 Linux (Ubuntu v.16.04) 上使用 gfortran 编译器 (v5.4.0)。我不是 Fortran、gcc 或 bash 脚本的经验丰富的用户,所以我在这里挣扎。
当我的程序完成 运行 时,我收到以下消息:
Note: The following floating-point exceptions are signalling: IEEE_DENORMAL
我不得不查一下 - 我知道我的一些浮点数需要存储 "denormal",这是一种用于非常小的数字的低精度形式(而不是将它们清零)。这些来自程序中不稳定的空气动力学计算——我在手写计算时看到了这一点。这些非正规数量不太可能显着影响我的结果,但为了尝试找出 where/why 这种情况正在发生,我尝试使用以下错误选项进行编译:
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 行,在 "subroutine1" 中,出现了问题。 [这是 "code.f" 中对 "subroutine2" 的调用]
*3。在 "code.f" 的第 3601 行,在 "subroutine2" 中,出现了问题。 [这是条件语句]
if (windspd_2m.ge.5.0) then...
所以 DENORMAL 错误一定发生在 "then" 操作中(我没有包含该代码,因为 (a) 它涉及一系列长而复杂的依赖关系,并且 (b) 我可以解开数学错误,这是我正在努力解决的调试错误。
但是对于上面的错误2,1,0...我不知道如何解释numbers/letters这些字符串。我也不知道 "discriminator 3" 是什么意思。我用谷歌搜索了这些,但我发现的唯一资源是在假设比我拥有更高水平的知识的情况下解释它们。假设对 Fortran、gcc 或 bash 脚本编制知之甚少,谁能帮我解释这些错误代码?
前三个堆栈帧是由于在 GFortran 运行时库 (libgfortran) 中实现了回溯。回溯无法以符号方式解析动态库中的地址,因此您只能获得地址。如果你想看到符号输出,你可以在你的编译选项中添加“-static”。
因此我的第一个猜测是错误在 code.f:3601,并且由于 5.0 是一个常数,因此 windspd_2m 应该是非正规的。