| ホーム >> | プログラミング >> | gdb |
| 参考: | GDBによるデバグ |
| gdb(千葉工大屋代研) | |
| GDBでデバッグ(阪大情報工三浦氏) | |
| 私的 GNU マニュアル翻訳プロジェクト(市川和久氏) | |
| gdb(Debug on Unix)(INOUE氏) |
ソースプログラムのコンパイル時に、オプション -g を付けておく。オブジェクトファイルを作る時には、
% gcc -c -g test.c
ソースが一つしかなくて、実行できるプログラム(LM)を直接作成するなら、
% gcc -g -o test test.c
の様にすれば良い。-g オプションを付けてコンパイルしておかないと、下記のようにブレークポイントなどの設定ができないので注意。
% gdb LM
LM(ロードモジュール)はコンパイル/リンク後に作成される実行可能なプログラムの事を表す。
(gdb) run
ブレークポイントを付けておくと、実行時にそこで停止することができる。
(gdb) break main.c:83
これで、main.c の 83行目の所で実行を停止させることができる。現在設定しているブレークポイントを確認するには、
(gdb) info break
とすれば良い。ブレークポイントを削除する時には、
(gdb) delete n
nにはブレークポイントの番号を指定する。番号を指定しなければ全てのブレークポイントを削除することができる。
(gdb) kill
breakで実行を停止している時に、その時点での変数値を見ることができる。
(gdb) print 変数名
ある変数の変化を常に表示させたい時には display コマンドを用いる。
(gdb) display 変数名
これを使うと、例えば nextコマンドで一行ずつ実行する時などに毎回、自動的に変数名を表示してくれる。表示を消したい時には、
(gdb) undisplay 変数名
ブレークポイントで停止した位置から、指定行数だけ実行を進めるには、
(gdb) next n
nには進めたい行数を指定する。省略すると一行進める。
同様のコマンドに step がある。
(gdb) step
next は次の行に関数があった場合にその関数を全て実行するのに対して、step は関数内に入ってさらに一行ずつ進めることができる。
ブレークポイントで停止した実行を再開する。次のブレークポイントがあればそこまで実行し、無ければ最後まで実行する。
(gdb) continue
continueの引数として数字を与えると、その数字の回数だけブレークポイントを通過(無視)させることができる。
(gdb) continue 3
(gdb) list
(gdb) where
(gdb) quit
| 参考: | シンボリックデバッガ(gdb)によるデバッグ (信州大学) |
例えば for ループ内で指定したカウント数で実行するには、次のようにすれば良い。
(gdb) break main.c:45 if i > 20
この意味はソースファイルmain.c の45行目(ここがループ内であること)で、カウンタ変数 i が20をこえたら実行を停止すると言うこと。
もう一つの方法は watch コマンドを用いる。
(gdb) watch i>20
こうすると実行中にどこであれ、i>20 が成り立つと実行を停止する。ただし、watchを使う時にはループの中まで進めて、breakで止めておいて使う。ループ以外で使う時にもwatchする変数が初期化されてから watchコマンドを使う。このwatchポイントを付けるとプログラムの実行時間がかなり長くなる。
現在ていしているブレイクポイントを削除するには
(gdb) clear
とすれば良い。具体的にどのファイルの何行目か、などbreakコマンドで設定した方法で指定すれば、そのブレイクポイントを削除できる。
(gdb) clear main.c:23
あらかじめ info break コマンドでブレイクポイントの番号が分かっているならば、その番号を指定することで削除することができる。このときはdeleteコマンドを用いる。
(gdb) delete 2
設定したブレイクポイントを削除せずに一時的に無効化したり、再度有効化することができる。あらかじめ info break でブレイクポイントの番号を調べておき、
(gdb) disable 3
で無効化、
(gdb) enable 3
で有効化できる。
ループなどを指定回数だけ回して、その後停止させるには ignoreコマンドを用いて、ブレイクポイントを無視させると良い。
(gdb) ignore 3 50
第一引数はブレイクポイントの番号、第二引数は通過させたい回数(カウント)。カウントは通過する毎に減少して0になるとそのブレイクポイントで停止する。
info program
プログラムの状態を確認する。実行中なら、そこで停止している理由や場所などを表示する。
info break
ブレイクポイントの情報や番号を表示する。
info display
displayコマンドで表示することになっている変数のリスト。削除したいときは、
delete display 番号
とすれば良い。