ファイヤープロジェクト
シグナル
2003-07-20T15:13+09:00   matsu
gdbではシグナルの制御もできる.
gdbではgdbがシグナルを受信したときにどうするかについて,処理テーブルを保持している.処理テーブルには以下のフィールドがある.
Signal
シグナルの名前.
Stop
プログラムを停止するかどうか.
Print
シグナル受信の旨を表示するかどうか.
Pass to program
シグナルをプログラムに渡すかどうか.
Description
シグナルの説明.
処理テーブルは以下で表示できる.
info signals
なんかたくさん表示された.指定したシグナルだけを表示することもできる.
info signals SIGXXX
SIGXXXには例えばSIGINTなどが入る.
まず,サンプルを用意してみた.
これはフラグが1の間sleepする.SIGUSR1を受信するとフラグを0にしてsleepのループを抜ける.ということで,まずSIGUSR1の処理がどうなっているか調べてみる.
$ gdb a.out 
(gdb) info signals SIGUSR1
Signal        Stop      Print   Pass to program Description
SIGUSR1       Yes       Yes     Yes             User defined signal 1
この場合,gdbはSIGUSR1を受信するとプログラムを停止し,受信した旨を表示し,シグナルをプログラムに渡す.プログラムは次に継続実行やステップ実行などで動いた時にシグナルを検出する.次に実際に送信してみる.まずループ内とシグナルハンドラ内にbreakポイントを設定してrunする.
(gdb) break 19
Breakpoint 1 at 0x8048530: file signal.c, line 19.
(gdb) break 28
Breakpoint 2 at 0x8048557: file signal.c, line 28.
(gdb) run
Starting program: /home/hoge/programing/c/learn-gdb/signal/a.out 

Breakpoint 1, main () at signal.c:19
19          sleep(1);
次にsignalでシグナルを送信してみる.signalはプロセスを再開すると同時に指定したシグナルをプロセスに送信するコマンドである.
(gdb) signal SIGUSR1
Continuing with signal SIGUSR1.

Breakpoint 2, sig_handler (sig=10) at signal.c:28
28        repeat_flag = 0;
どうやら意図どうりシグナルハンドラのbreakポイントで止まったようだ.そして再開.
(gdb) c
Continuing.

Breakpoint 1, main () at signal.c:19
19          sleep(1);
(gdb) c
Continuing.

Program exited normally.
(gdb) quit
シグナル処理の変更は以下で行なう.
handle SIGXXX command
commandには以下がある.
stop
シグナルを受信するとgdbはプログラムを停止する.
nostop
シグナルを受信してもgdbはプログラムを停止しない.
print
シグナルを受信するとgdbはその旨を表示する.
noprint
シグナルを受信してみgdbはその旨を表示しない.
pass
シグナルを受信するとgdbはそのシグナルをプログラムに渡す.
nopass
シグナルを受信してもgdbはそのシグナルをプログラムに渡さない.
matsu(C)
Since 2002
Mail to matsu