解释回溯错误信息
interpreting backtrace error message
当我使用 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 ???
我的问题是:如何解释这些数字和 ??? 在 "backtrace for this error:" 下。我如何使用此错误消息来帮助我找到错误?它们是否以某种方式与有问题的特定代码行相关?如果可以,怎么做?
到目前为止,我意识到我有一个错误的算术运算错误,但我不知道在哪里,这个回溯错误消息根本没有帮助。如果我仅使用 gfortran File.f90 进行编译,则在编译期间或 运行.
期间根本没有错误消息
这可能取决于您使用的目标。 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 无法解析动态库中的符号。如果我 link 它是静态的:
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
当我使用 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 ???
我的问题是:如何解释这些数字和 ??? 在 "backtrace for this error:" 下。我如何使用此错误消息来帮助我找到错误?它们是否以某种方式与有问题的特定代码行相关?如果可以,怎么做?
到目前为止,我意识到我有一个错误的算术运算错误,但我不知道在哪里,这个回溯错误消息根本没有帮助。如果我仅使用 gfortran File.f90 进行编译,则在编译期间或 运行.
期间根本没有错误消息这可能取决于您使用的目标。 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 无法解析动态库中的符号。如果我 link 它是静态的:
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