次: , 前: Continuing and Stepping, 上: Stopping


5.3 シグナル

シグナルは、 プログラム内で発生する非同期イベントです。 オペレーティング・システムによって、 使用可能なシグナルの種類が定義され、 それぞれに名前と番号が割り当てられます。 例えば、 UNIXにおいては、 割り込み (通常は、Ctrlキーを押しながらCを押す) を入力したときにプログラムが受信する SIGINT、 その使用領域からかけ離れたメモリ域を参照したときにプログラムが受信するSIGSEGV、 アラームのタイムアウト時に発生する (プログラムからアラームを要求した場合にのみ発生する) SIGALRMシグナルなどがあります。

SIGALRMなど、 いくつかのシグナルは、 プログラムの正常な機能の一部です。 SIGSEGVなどの他のシグナルは、 エラーを意味します。 これらのシグナルは、 プログラムが事前にそれを処理する何らかの方法を指定しないと、 致命的な (プログラムを即座に終了させる) ものとなります。 SIGINTはユーザ・プログラム内部のエラーを意味するものではありませんが、 通常は致命的なものであり、 割り込みの目的であるプログラムの終了を実現することができます。

GDBは、 ユーザ・プログラム内部における任意のシグナル発生を検出することができます。 ユーザは、 個々のシグナルの発生時に何を実行するかを、 GDBに対して事前に指定することができます。

通常GDBは、 SIGALRMのようなエラーではないシグナルを無視するよう (これらのシグナルがユーザ・プログラムの中で持っている役割を妨害することのないよう) 設定されています。 その一方で、 エラーのシグナルが発生した場合にはすぐにユーザ・プログラムを停止させるよう設定されています。 これらの設定はhandleコマンドによって変更することができます。

info signals
すべてのシグナルを一覧にして表示します。 また、 個々のシグナルについて、 GDBがそれをどのように処理するよう設定されているかを表示します。 このコマンドを使用して、 定義済みのすべてのシグナルのシグナル番号を知ることができます。

info handleは、 info signalsに対して設定された新しい別名です。


handle signal keywords...
GDBがsignalで指定されるシグナルを処理する方法を変更します。 signalには、 シグナル番号またはシグナル名称 (先頭の`SIG'は省略可能) を指定します。 キーワードkeywordsによって、 どのように変更するかを指定します。

handleコマンドが受け付けるキーワードには省略形を使用することができます。 省略しない場合、 キーワードは以下のようになります。

nostop
GDBに対して、 このシグナルが発生してもユーザ・プログラムを停止しないよう指示します。 GDBは、 シグナルを受信したことをメッセージ出力によってユーザに通知することができます。
stop
GDBに対して、 このシグナルが発生するとユーザ・プログラムを停止するよう指示します。 これは、 printキーワードを暗黙のうちに含みます。
print
GDBに対して、 このシグナルが発生するとメッセージを表示するよう指示します。
noprint
GDB に対して、 このシグナルが発生したことを知らせないよう指示します。 これは、 nostopキーワードを暗黙のうちに含みます。
pass
GDBに対して、 このシグナルの発生をユーザ・プログラムが検出できるようにするよう指示します。 ユーザ・プログラムはシグナルを処理することができます。 致命的で処理できないシグナルが発生した場合、 ユーザ・プログラムは停止するかもしれません。
nopass
GDBに対して、 このシグナルの発生をユーザ・プログラムが検出できないようにするよう指示します。

シグナルによってユーザ・プログラムが停止した場合、 実行を継続するまでそのシグナルは検出されません。 その時点において、 そのシグナルに対してpassキーワードが有効であれば、 ユーザ・プログラムは、 実行継続時にシグナルを検出します。 言い換えれば、 GDBがシグナルの発生を報告してきたとき、 handleコマンドにpassキーワードまたはnopassキーワードを指定することで、 実行を継続したときにプログラムにそのシグナルを検出させるか否かを制御することができます。

また、 signalコマンドを使用することによって、 ユーザ・プログラムがシグナルを検出できないようにしたり、 通常は検出できないシグナルを検出できるようにしたり、 あるいは任意の時点で任意のシグナルをユーザ・プログラムに検出させたりすることができます。 例えば、 ユーザ・プログラムが何らかのメモリ参照エラーによって停止した場合、 ユーザは、 さらに実行を継続しようとして、 問題のある変数に正しい値を設定して継続実行しようとするかもしれません。 しかし、 実行継続直後に検出される致命的なシグナルのために、 おそらくユーザ・プログラムはすぐに終了してしまうでしょう。 このようなことを回避したければ、 `signal 0'コマンドによって実行を継続することができます。 See Giving your program a signal