2017-08-02 9 views
1

は=無効、オーバーフロー、アンダーフロー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 ??? 

私の質問は:どのようにすることができます私はこれらの数字を解釈し、このエラーのバックトレースの下にある?このエラーメッセージを使用してエラーを見つける方法を教えてください。彼らは何とか問題のある特定のコード行に関係していますか?もしそうなら、どうですか?

私は誤った演算誤差を持っているが、私はこのバックトレースのエラーメッセージがまったく役に立たない見当がつかない実現今のところ。 gfortran File.f90だけを使用してコンパイルすると、コンパイル中または実行中にエラーメッセージが表示されません。

+0

を取得しますエラーが起こっていると、私は 'print'ステートメントをどこにでも振りかけて、最後に何が印刷されたのかを見ていきます。便利な場所がない場合は、通常、スコープを絞り込むための最良の方法です。使用可能な場合はデバッガも良いオプションになります。 – Carcigenicate

+0

@Carcigenicate私はそれをしました。ありがとうございました! –

+0

デバッグ時に、私は通常、最適化( '-O0')を無効にしています。 – chw21

答えて

2

それはあなたが使用しているどのターゲットに依存する場合があります。 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 
+0

多くのお返事とすべてを説明する簡単なコードをありがとう。私には2つの質問/説明があります。これは明らかかもしれませんが、明確にしたいだけですが、提供するサンプルコードの問題はaを実数として定義した後にa = sqrt(-1)を使用することです。したがってaは実数ではありません。したがって、この誤った算術演算が行われています。正しい?次に、「trap = invalid」を使用してコンパイルした場合、エラーメッセージは一切表示されず、コードを実行するとすべて正常です。しかし、私が 'trap = invalid'を使用すると、アンダーフローします。エラーメッセージが表示されます。どのように「トラップ」からアンダーフローを取り除くと、すべてが変わりますか? –

+0

@JeffFaraci bは実数なので、sqrt(b)も実数です。整数リテラルからbを初期化すると、bは整数に変換されず、整数値は実数変数に代入されると実数に変換されます。私は私の例では負の数のsqrt()をトラッピングするのに十分なので、fpe-trap = invalidしか使用していませんでした。私はあなたのコードを見ていないので、どの例外がそこにトラップを引き起こすのか分かりません。 – janneb