シグナル
gdbではシグナルの制御もできる.
gdbではgdbがシグナルを受信したときにどうするかについて,処理テーブルを保持している.処理テーブルには以下のフィールドがある.
- Signal
- シグナルの名前.
- Stop
- プログラムを停止するかどうか.
- シグナル受信の旨を表示するかどうか.
- Pass to program
- シグナルをプログラムに渡すかどうか.
- Description
- シグナルの説明.
info signalsなんかたくさん表示された.指定したシグナルだけを表示することもできる.
info signals SIGXXXSIGXXXには例えば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 commandcommandには以下がある.
- stop
- シグナルを受信するとgdbはプログラムを停止する.
- nostop
- シグナルを受信してもgdbはプログラムを停止しない.
- シグナルを受信するとgdbはその旨を表示する.
- noprint
- シグナルを受信してみgdbはその旨を表示しない.
- pass
- シグナルを受信するとgdbはそのシグナルをプログラムに渡す.
- nopass
- シグナルを受信してもgdbはそのシグナルをプログラムに渡さない.

