Next: Thread Stops, Previous: Continuing and Stepping, Up: Stopping
シグナルは、
プログラム内で発生する非同期イベントです。
オペレーティング・システムによって、
使用可能なシグナルの種類が定義され、
それぞれに名前と番号が割り当てられます。
例えば、
UNIXにおいては、
割り込み
(通常は、Ctrlキーを押しながらCを押す)
を入力したときにプログラムが受信する
SIGINT
、
その使用領域からかけ離れたメモリ域を参照したときにプログラムが受信するSIGSEGV
、
アラームのタイムアウト時に発生する
(プログラムからアラームを要求した場合にのみ発生する)
SIGALRM
シグナルなどがあります。
SIGALRM
など、
いくつかのシグナルは、
プログラムの正常な機能の一部です。
SIGSEGV
などの他のシグナルは、
エラーを意味します。
これらのシグナルは、
プログラムが事前にそれを処理する何らかの方法を指定しないと、
致命的な
(プログラムを即座に終了させる)
ものとなります。
SIGINT
はユーザ・プログラム内部のエラーを意味するものではありませんが、
通常は致命的なものであり、
割り込みの目的であるプログラムの終了を実現することができます。
GDBは、 ユーザ・プログラム内部における任意のシグナル発生を検出することができます。 ユーザは、 個々のシグナルの発生時に何を実行するかを、 GDBに対して事前に指定することができます。
通常GDBは、
SIGALRM
のようなエラーではないシグナルを無視するよう
(これらのシグナルがユーザ・プログラムの中で持っている役割を妨害することのないよう)
設定されています。
その一方で、
エラーのシグナルが発生した場合にはすぐにユーザ・プログラムを停止させるよう設定されています。
これらの設定はhandle
コマンドによって変更することができます。
info signals
info handle
は、
info signals
に対して設定された新しい別名です。
handle
signal keywords...
handle
コマンドが受け付けるキーワードには省略形を使用することができます。
省略しない場合、
キーワードは以下のようになります。
nostop
stop
print
キーワードを暗黙のうちに含みます。
print
noprint
nostop
キーワードを暗黙のうちに含みます。
pass
nopass
シグナルによってユーザ・プログラムが停止した場合、
実行を継続するまでそのシグナルは検出されません。
その時点において、
そのシグナルに対してpass
キーワードが有効であれば、
ユーザ・プログラムは、
実行継続時にシグナルを検出します。
言い換えれば、
GDBがシグナルの発生を報告してきたとき、
handle
コマンドにpass
キーワードまたはnopass
キーワードを指定することで、
実行を継続したときにプログラムにそのシグナルを検出させるか否かを制御することができます。
また、
signal
コマンドを使用することによって、
ユーザ・プログラムがシグナルを検出できないようにしたり、
通常は検出できないシグナルを検出できるようにしたり、
あるいは任意の時点で任意のシグナルをユーザ・プログラムに検出させたりすることができます。
例えば、
ユーザ・プログラムが何らかのメモリ参照エラーによって停止した場合、
ユーザは、
さらに実行を継続しようとして、
問題のある変数に正しい値を設定して継続実行しようとするかもしれません。
しかし、
実行継続直後に検出される致命的なシグナルのために、
おそらくユーザ・プログラムはすぐに終了してしまうでしょう。
このようなことを回避したければ、
‘signal 0’コマンドによって実行を継続することができます。
See Giving your program a signal。