浮動小数点の計算が必要なコードを扱っている場合には、プログラム内で発生した例外をデバッグしなければならないことがよくあります。オーバーフローやゼロ除算などの浮動小数点例外が発生すると、例外を起こした演算の結果としてシステムが「適正な」答えを返します。適正な答えが返されることで、プログラムは正常に実行を続けることができます (Solaris OS は、IEEE 標準のバイナリ浮動小数点演算定義の、例外に対する「適正 (reasonable) な」答えを実装しています)。
浮動小数点例外に対して適正な答えを返すため、例外によって自動的に SIGFPE シグナルが生成されることはありません。例外の場合 (ゼロで整数を割ると整数がオーバーフローする場合など) は、デフォルトでは SIGFPE シグナルをトリガーします。
例外の原因を見つけ出すためには、例外によって SIGFPE シグナルが生成されるように、トラップハンドラをプログラム内で設定する必要があります (トラップハンドラの例については、ieee_handler(3m) コマンドのマニュアルページを参照)。
トラップを有効にするには、次のコマンド等を利用します。
ieee_handler
fdsetmask (fdsetmask(3c) マニュアルページ参照)
-ftrap コンパイラフラグ (Fortran 95 については、マニュアルページ f95(1) を参照)
ieee_handler コマンドを使用してトラップハンドラを設定すると、ハードウェア浮動小数点状態レジスタ内のトラップ許可マスクがセットされます。このトラップ許可マスクにより、実行中に例外が発生すると SIGFPE シグナルが生成されます。
トラップハンドラ付きのプログラムをコンパイルしたあと、そのプログラムを dbx に読み込んでください。ここで、SIGFPE シグナルが捕獲されるようにするには、dbx のシグナル捕獲リスト (catch リスト) に FPE を追加する必要があります。
(dbx) catch FPE |
FPE はデフォルトでは ignore リストに含まれています。
FPE を catch リストに追加後、dbx でプログラムを実行します。トラップしている例外が発生すると SIGFPE シグナルが生成され、dbx はプログラムを停止します。ここで、呼び出しスタックを (dbx コマンド where を使用して) トレースすることにより、プログラムの何行目で例外が発生したかを調べることができます (「where コマンド」参照)。
例外処理の原因を調べるには、regs -f コマンドを実行して浮動小数点状態レジスタ (FSR) を表示します。このレジスタで、発生した例外処理 (aexc) フィールドと現在の例外処理 (cexc) フィールドの内容を確認します。このフィールドには次のような浮動小数点例外条件が格納されています。
無効なオペランド
オーバーフロー
アンダーフロー
ゼロによる除算
不正確な結果
浮動小数点状態レジスタの詳細については、『SPARC アーキテクチャーマニュアルバージョン 8』(V9 の場合はバージョン 9) を参照してください。説明と例については、『数値演算ガイド』を参照してください。