dbx コマンドによるデバッグ |
第 14 章
シグナルの処理
この章では、
dbx
を使用してシステムシグナルを処理する方法を説明します。dbx
は、catch
というブレークポイントコマンドをサポートします。catch
コマンドは、catch
リストに登録されているシステムシグナルのいずれかが検出された場合にプログラムを停止するようdbx
に指示します。また、
dbx
コマンドcont
、step
、next
は、オプション-sig
signal_name をサポートします。このオプションを使用すると、実行を再開したプログラムに対し、cont -sig
コマンドで指定したシグナルを受信した場合の動作をさせることができます。シグナルイベントについて
デバッグ中のプロセスにシグナルが送信されると、そのシグナルはカーネルによって
dbx
に送られます。通常、このことはプロンプトによって示されますが、そこでは次の 2 つの操作から 1 つを選択してください。
- プログラムを再開するときにそのシグナルを「取り消し」ます。これは、
cont
コマンドのデフォルトの動作です。これにより、次の図 14-1のようなSIGINT
(Control-C) を使用した割り込みと再開が容易になります。
図 14-1 SIGINT シグナルの阻止と取り消し
- 次のコマンドを使用して、シグナル sig をプロセスに「転送」します。
cont -sig
sigさらに、特定のシグナルを頻繁に受信する場合、そのシグナルを
dbx
が自動的に転送するように設定できます。次のように入力します。
ignore
sig# "ignore"
以上の操作をしてもシグナルはプロセスに送信されます。シグナルがデフォルト設定で、このように自動送信されるようになっているからです (Sun WorkShop オンラインヘルプの「dbx コマンドの使い方」の「ignore コマンド」参照)。
システムシグナルを捕獲する
デフォルトのシグナル捕獲リスト (catch リスト) には、33 種類の検出可能なシグナルのうちの 22 種類が含まれています (これらの数はオペレーティングシステムとそのバージョンによって異なります)。デフォルトの catch リストは、リストにシグナルを追加したり削除したりすることによって変更できます。
現在捕獲されているシグナルのリストを調べるには、シグナルの引数を指定せずに、次のように入力します。
(dbx)
catch
プログラムで検出された場合でも、現在無視されているシグナルのリスト (ignore リスト) を調べるには、シグナル名の引数を指定せずに、次のように入力します。
(dbx)
ignore
デフォルトの
catch
リストとignore
リストを変更するどのシグナルでプログラムを停止するかは、2 つのリストの間でシグナル名を移動することによって制御します。シグナル名を移動するには、一方のリストに現在表示されているシグナル名を、もう一方のリストに引数として渡します。
たとえば、
QUIT
シグナルとABRT
シグナルを catch リストから ignore リストに移動するには、次のように入力します。
(d
bx)
ignore QUIT ABRT
FPE
シグナルをトラップする浮動小数点の計算が必要なコードを扱っている場合には、プログラム内で発生した例外をデバッグしなければならないことがよくあります。オーバーフローやゼロ除算などの浮動小数点例外が発生すると、例外を起こした演算の結果としてシステムが「適正な」答を返します。適正な答が返されることで、プログラムは正常に実行を続けることができます (Solaris 2.x コンピュータは、IEEE 標準のバイナリ浮動小数点演算定義の、例外に対する「適正 (reasonable) な」答を実装しています)。
浮動小数点例外に対して適正な答を返すため、例外によって自動的に
SIGFPE
シグナルが生成されることはありません。例外の原因を見つけ出すためには、例外によって
SIGFPE
シグナルが生成されるように、トラップハンドラをプログラム内で設定する必要があります (トラップハンドラの例については、マニュアルのieee_handler
(3m) コマンドを参照)。
ieee_handler
fdsetmask
(fdsetmask
(3c) マニュアルページ参照)-ftrap
コンパイラフラグ (FORTRAN 77 と Fortran 95 については、マニュアルページf77
(1) とf95
(1) を参照)
ieee_handler
コマンドを使用してトラップハンドラを設定すると、ハードウェア浮動小数点状態レジスタ内のトラップ許可マスクがセットされます。このトラップ許可マスクにより、実行中に例外が発生するとSIGFPE
シグナルが生成されます。トラップハンドラ付きのプログラムをコンパイルした後、そのプログラムを
dbx
に読み込んでください。ここで、SIGFPE
シグナルが捕獲されるようにするには、dbx
のシグナル捕獲リスト (catch
リスト) にFPE
を追加する必要があります。
(dbx)
catch FPE
FPE
はデフォルトではignore
リストに含まれています。
FPE
をcatch
リストに追加後、dbx
でプログラムを実行します。トラップしている例外が発生するとSIGFPE
シグナルが生成され、dbx
はプログラムを停止します。ここで、呼び出しスタックを (dbx
コマンドwhere
を使用して) トレースすることにより、プログラムの何行目で例外が発生したかを調べることができます。(Sun WorkShop オンラインヘルプの「dbx コマンドの使い方」の「where コマンド」参照)。例外処理の原因追求
例外処理の原因を調べるには、
regs -f
コマンドを実行して浮動小数点状態レジスタ (FSR) を表示します。このレジスタで、発生した例外処理 (aexc
) フィールドと現在の例外処理 (cexc
) フィールドの内容を確認します。このフィールドには次のような浮動小数点例外条件が格納されています。浮動小数点状態レジスタの詳細については、『 SPARC アーキテクチャマニュアル バージョン 8』(V9 の場合はバージョン 9) を参照してください。
プログラム内でシグナルを送信する
dbx
コマンドcont
は、オプション-sig
signal をサポートします。このオプションを使用すると、実行を再開したプログラムに対し、指定したシステムシグナルsignal を受信した場合の動作をさせることができます。たとえば、プログラムに
SIGINT
(^C
) の割り込みハンドラが含まれている場合、^C
を入力することによって、アプリケーションを停止し、dbx
に制御を返すことができます。ここで、プログラムの実行を継続するときにオプションなしのcont
コマンドを使用すると、割り込みハンドラは実行されません。割り込みハンドラを実行するためには、プログラムにSIGINT
シグナルを送信する必要があります。次のコマンドを使用します。
(dbx)
cont -sig int
stop、next、detach
コマンドも、-sig
オプションを指定できます。シグナルの自動処理
イベント管理コマンドでは、シグナルをイベントとして処理することもできます。次の 2 つのコマンドの結果は同じになります。
(dbx)
stop sig signal
(dbx)
catch
signalプログラミング済みのアクションを関連付ける必要がある場合、シグナルイベントがあると便利です。
(dbx)
when sig SIGCLD {echo Got $sig $signame;}
この場合は、まず
SIGCLD
をignore
リストに必ず移動してください。
(dbx)
ignore SIGCLD
サン・マイクロシステムズ株式会社 Copyright information. All rights reserved. |
ホーム | 目次 | 前ページへ | 次ページへ | 索引 |