Sun Studio 12: Fortran プログラミングガイド

6.4 IEEE の例外のデバッグ

どこで 例外が発生したかを突き止めるためには、トラップを有効にした例外が必要です。そのためには、 -ftrap=common オプション (f95 でコンパイルする場合のデフォルト) を付けてコンパイルするか、ieee_handler() により例外ハンドラルーチンを呼び出します。例外トラップを有効にして、dbx からプログラムを実行し、dbx catch FPE コマンドを使用すれば、どこでエラーが発生するかを見つけることができます。

-ftrap=common を付けてコンパイルすることの利点は、例外をトラップするようにソースコードを変更する必要がないことです。しかし、ieee_handler() を呼び出すことによって、探すべき例外をより限定できます。

例: コンパイルし直して、dbx を使用します。


demo% f95 -g myprogram.f
demo% dbx a.out
a.out の読み込み中
...
(dbx) catch FPE
(dbx) run
実行中: a.out
(プロセス id 19739)
シグナル FPE (ゼロによる浮動小数点除算) 関数 MAIN 行番号 212 ファイル "myprogram.f"
  212               Z = X/Y
(dbx)  print Y
y = 0.0
(dbx)

プログラムが終了したときオーバーフローとほかの例外が発生していた場合、ieee_handler() を呼び出してオーバーフローだけをトラップすることによって、最初のオーバーフローを突き止めることができます。このためには、次の例に示すように、主プログラムのソースコードを必要最小限だけ修正する必要があります。

例: ほかの例外も発生しているときにオーバーフローを突き止めます。


demo% 


cat myprog.F
#include "floatingpoint.h"
        program myprogram
...
      ier = ieee_handler('set','overflow',SIGFPE_ABORT)
...
demo% f95 -g myprog.F
demo% dbx a.out
a.out の読み込み中
...
(dbx) catch FPE
(dbx) run
実行中: a.out
(プロセス id 19793)
シグナル FPE (浮動小数点オーバーフロー) 関数 MAIN 行番号 55 ファイル "myprog.F"
   55               w = rmax * 200.                     ! オーバーフローの原因
(dbx) cont                                   ! 実行を継続して終了する
実行完了。終了コードは、0 です
(dbx)

例外を選択するため、この例では、#include を導入しています。 このため、ソースファイルの名前を .F 接尾辞に変更し ieee_handler() を呼び出す必要があります。さらに一歩進んで、オーバーフロー例外時に呼び出されるユーザー独自のハンドラ関数を作成し、アプリケーション特有な解析を行い、異常終了する前に中間結果またはデバッグ結果を出力することもできます。