それはあなたが使用しているどのターゲットに依存する場合があります。 GFortranバックトレース機能は、すべてのターゲットで機能しないlibbacktraceに依存します。コード
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
でコンパイルするためのUbuntu 16.04 x86_64版では、私は、スタックフレーム#3にエラーがで5行目で発生していることがわかります
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
を取得しますbt.f90。
さて、スタック上のものは#0〜#2をフレーム何ですか?彼らは、Gfortranランタイムライブラリであるlibgfortranのバックトレース機能です。 1つまたは複数の理由でlibbacktraceを実行すると、ダイナミックライブラリのシンボルを解決できません。私は静的にリンクする場合:
gfortran -g -static -ffpe-trap=invalid bt.f90
私はFORTRAN知らないが、私はそれが明確ではないが、他の言語では、このような奇妙なメッセージに実行したとき
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
を取得しますエラーが起こっていると、私は 'print'ステートメントをどこにでも振りかけて、最後に何が印刷されたのかを見ていきます。便利な場所がない場合は、通常、スコープを絞り込むための最良の方法です。使用可能な場合はデバッガも良いオプションになります。 – Carcigenicate
@Carcigenicate私はそれをしました。ありがとうございました! –
デバッグ時に、私は通常、最適化( '-O0')を無効にしています。 – chw21