web-dev-qa-db-ja.com

gdbとgfortranを使用したデバッグ-FPE

追加した大きな数値プログラムをデバッグしています。これは、fortran90で書かれており、gfortran(Macで利用可能な最新バージョン)でコンパイルされており、gdb(ここでもMacで利用可能な最新バージョン)を使用してデバッグしています。

私の追加にはどこかにバグがあり、それを見つけようとしています。これは、プログラムを実行しても期待した結果が得られないことは明らかです。 gdbで実行すると、最後に次の出力が表示されます。

Note: The following floating-point exceptions are signalling: IEEE_INVALID_FLAG IEEE_DIVIDE_BY_ZERO IEEE_UNDERFLOW_FLAG IEEE_DENORMAL [Inferior 1 (process 83843) exited normally]

このFPEが発生する場所を正確に特定したいが、浮動小数点例外が原因でプログラムがクラッシュしないようです。私はコードで明示的に0で除算してこれをテストしました-プログラムの実行を停止させることはありませんでしたが、予期しない動作につながりました。

プログラムが浮動小数点例外に達したときにプログラムが(理想的にはバックトレースで)実行を停止することを保証するためのgdbまたはgfortranの適切なフラグは何ですか? こちら の手順に従ってみましたが、何も変更されていないようです。

13

おそらく、コードをコンパイルするときにこれらのフラグを追加する必要があります。

gfortran -g -fbacktrace -ffpe-trap=zero,overflow,underflow youcode.f90 -o run.exe



gfortranマニュアルのコンパイラフラグの説明:

-g       

デバッグデータを含める

-fbacktrace

ランタイムエラーが発生した場合、または致命的な信号(セグメンテーションフォールト、不正な命令、バスエラーまたは浮動小数点例外)が発生した場合、Fortranランタイムライブラリがエラーのバックトレースを出力するように指定します。このオプションは、Fortranメインプログラムのコンパイルにのみ影響します。

-ffpe-trap=list

浮動小数点例外(FPE)が発生する場合のIEEE例外のリストを指定します。ほとんどのシステムでは、これによりSIGFPEシグナルが送信され、プログラムが中断され、デバッグに役立つコアファイルが生成されます。 listは、次のIEEE例外の(おそらく空の)コンマ区切りリストです:invalid(SQRT(-1.0)などの無効な浮動小数点演算)、zero(ゼロによる除算)、overflow(浮動小数点演算のオーバーフロー)、underflow(浮動小数点演算のアンダーフロー)、precision(演算中の精度の損失)およびdenormal(操作により非正規値が生成されました)。 「CPU_TIME」などのFortranランタイムライブラリの一部のルーチンは、ffpe-trap = precisionが使用されている場合、浮動小数点例外をトリガーする可能性があります。このため、ffpe-trap = precisionの使用はお勧めしません。

詳細については、次の2つの場所をご覧ください。

https://gcc.gnu.org/onlinedocs/gcc-4.3.2/gfortran.pdfhttp://faculty.washington.edu/rjl/uwamath583s11/sphinx/notes/ html/gfortran_flags.html

14
Bahman