解释回溯错误消息

时间:2017-08-02 17:06:28

标签: fortran gfortran

当我使用gfortran -g -fbacktrace -ffpe-trap = invalid,overflow,underflow File.f90编译我的代码时出现以下错误:

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

Backtrace for this error:

#0 0x7f3da0768ed7 in ???
#1 0x7f3da076810d in ???
#2 0x7f3d9fe9b7ef in ???
#3 0x7f3da0230a3e in ???

我的问题是:我怎样才能解释这些数字以及“#34;回溯”下的错误:"。如何使用此错误消息来帮助我找到错误?它们是否与某些有问题的特定代码行有关?如果是这样,怎么样?

到目前为止,我意识到我有一个错误的算术运算错误,但我不知道哪里和这个回溯错误信息根本没有帮助。如果我只使用gfortran File.f90编译,则在编译期间或运行期间根本没有错误消息。

1 个答案:

答案 0 :(得分:4)

这可能取决于您使用的目标。 GFortran回溯功能依赖于libbacktrace,它可能不适用于所有目标。在Ubuntu 16.04 x86_64上获取代码

program bt
  use iso_fortran_env
  implicit none
  real(real64) :: a, b = -1
  a = sqrt(b)
  print *, a
end program bt

使用

进行编译时
gfortran -g -ffpe-trap=invalid  bt.f90

我得到了

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

Backtrace for this error:
#0  0x7F08C38E8E08
#1  0x7F08C38E7F90
#2  0x7F08C35384AF
#3  0x4007F9 in MAIN__ at bt.f90:5
zsh: floating point exception  ./a.out

在堆栈帧#3上你可以看到错误发生在bt.f90的第5行。

现在,堆栈帧#0-#2上有什么东西?好吧,它们是libgfortran(GFortran运行时库)中的回溯功能。由于某种原因,libbacktrace无法解析动态库中的符号。如果我静态链接它:

gfortran -g -static -ffpe-trap=invalid  bt.f90

我得到了

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

Backtrace for this error:
#0  0x40139E in _gfortrani_backtrace
#1  0x400D00 in _gfortrani_backtrace_handler
#2  0x439B2F in gsignal
#3  0x400C01 in MAIN__ at bt.f90:5
zsh: floating point exception  ./a.out