ファイヤープロジェクト
breakポイント
2003-07-20T15:13+09:00   matsu
おそらく多くのデバッグ作業はbreakポイントとステップ実行で足りるものではないだろうか.ここではbreakポイントの設定方法を中心に記述する.breakポイントはいろんな方法で指定できるようだ.
まず,この項でgdbにかけるソースを以下にしめす.
念のため断っておくと,行番号はc2htmlで生成したものであって,実際のソースにはない.breakポイントは以下で指定した場所に設定できる.
  • 関数名
  • 行番号
  • 現在停止している場所から前後に何行か隔てた場所
  • アドレス
以下は関数mainにbreakポイントを設定した場合の例である.
$ gdb a.out 
(gdb) break main
Breakpoint 1 at 0x80484b6: file break-point.c, line 9.
(gdb) run
Starting program: /home/hoge/programing/c/learn-gdb/break-point/a.out 

Breakpoint 1, main (argc=1, argv=0xbffff6f4) at break-point.c:9
9         if(argc != 3){
(gdb) cont
Continuing.
Usage: /home/hoge/programing/c/learn-gdb/break-point/a.out outer_loop inner_loop 

Program exited with code 01.
そして以下は行番号でbreakポイントを設定した例である.
(gdb) break 19 
Breakpoint 4 at 0x8048541: file break-point.c, line 19.
(gdb) run 2  2
Starting program: /home/hoge/programing/c/learn-gdb/break-point/a.out 2  2

Breakpoint 4, main (argc=3, argv=0xbffff6e4) at break-point.c:19
19            fprintf(stdout,"hoge\n");
(gdb) c
Continuing.
hoge
そのときに設定されているbreakポイントはで確認できる.
info breakpoints
上では,すべてのbreakポイントを表示する.特定のbreakポイントを表示するには,
info breakpoints bnum
とする.bnumは何番目に設定したbreakポイントかを示す値で,
info breakpoints
でNumのところに表示される値である.breakポイントを削除するには,
delete bnum
とする.bnumを指定しない場合は全て削除する.breakポイントを削除するのではなく,一時的に無効化するには,
disable bnum
とする.このとき
info breakpoints
とするとEnbの欄がnになる.そして
enable bnum
とすると再び有効となる.
冒頭のサンプルで
break 19
とすると,19行目に到達するたびに処理が停止する.ここで,19行目に到達してかつi == jの場合だけ停止するようにするには以下のようにする.
break 19 if i == j
これは以下と同じである.
break 19
condition bnum i == j
bnumはやはり何番目のbreakポイントかを示す値である.また,breakポイントに到達しても最初の数回を無視するには,以下のようにする.
break 19
ignore bnum num
こうするとnumで指定した回数だけbreakポイントに達しても停止しない.breakポイントに達するたびにnumが1ずつ減る.そしてnumが0の時に停止する.したがってnumが0になって,再び何回か無視したい場合はもう一度ignoreで設定する必要がある.あるbreakポイントがあと何回無視されるかは
info breakpoints
で確認できる.例えば
(gdb) info break
Num Type           Disp Enb Address    What
12  breakpoint     keep y   0x08048541 in main at break-point.c:19
        breakpoint already hit 100 times
        ignore next 3 hits
と出る(最後の行).0の場合は無視する回数は表示されない.
ある変数値を追跡したいときに,breakする度にprintなどで変数を表示したいことがある.このような場合には,
commands bnum
> print i
> end
などとする.commands bnumと入力すると,>と表示される.ここにbreakする度に実行するコマンドを書く.そしてendでそれらのコマンドの入力が終る.あとはrunなりcontinueなりする.このコマンドを削除したい場合には,endだけを入力すればよい.
matsu(C)
Since 2002
Mail to matsu