breakポイント
おそらく多くのデバッグ作業はbreakポイントとステップ実行で足りるものではないだろうか.ここではbreakポイントの設定方法を中心に記述する.breakポイントはいろんな方法で指定できるようだ.
まず,この項でgdbにかけるソースを以下にしめす.
念のため断っておくと,行番号はc2htmlで生成したものであって,実際のソースにはない.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 == jbnumはやはり何番目の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だけを入力すればよい.

