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