理工系研究者のための Mac OS X, Windows, Linux メモ
 
ホーム >> プログラミング >> gdb

gdb(デバッガ)

  1. 準備
  2. 起動する
  3. gdb上でLMを実行する (run)
  4. ブレークポイントを付ける (break)
  5. 実行中のプログラムを終了する (kill)
  6. 変数値を確認する (print)
  7. 変数値を毎回表示する (display)
  8. 実行を一行進める (next, step)
  9. 実行を再開する (continue)
  10. 停止位置周辺のプログラムソースを見る (list)
  11. 停止位置がどの関数のどの位置にあるか確認する (where)
  12. 終了する (quit)
  13. 指定したループ回数のところで実行を止める (if)
  14. ブレイクポイントの削除(clear, delete)
  15. ブレイクポイントを無効化、有効化する (disable, enable)
  16. ブレイクポイントを指定回数だけ停止せずに通過させる (ignore)
  17. 情報を見る (info)

参考: 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上で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

指定したループ回数のところで実行を止める (if)

参考: シンボリックデバッガ(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ポイントを付けるとプログラムの実行時間がかなり長くなる。

ブレイクポイントの削除(clear)

現在ていしているブレイクポイントを削除するには

(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)

info program

プログラムの状態を確認する。実行中なら、そこで停止している理由や場所などを表示する。

info break

ブレイクポイントの情報や番号を表示する。

info display

displayコマンドで表示することになっている変数のリスト。削除したいときは、

delete display 番号

とすれば良い。