gdbの使い方
gdbはデバッガです.デバッガとは,デバッグするためのツールです.デバッグ
というのは,プログラムが想定した通りに動かない場合に,それを修正すること
です.
※コンパイル時に-gオプションをつけること.
- muleでM-x gdbとする.
-
Run gdb (like this): gdb
と出るので,デバッグしたいプログラムの名前を入れます.現在編集中のファ
イルのあるディレクトリを基準として,書くので,違うディレクトリにいる場
合には,パスも書きます.
例: ~/src/foo.c を編集中にM-x gdbをした場合で,~/bin/barをデバッグ
したい場合
Run gdb (like this): gdb ../bin/bar
Run gdb (like this): gdb ~/bin/bar
の(どちらかの)ように指定します.
- Current directory.....などと数行表示されて,(gdb)という表示が左隅に出
ます.
- ここでいきなり実行したい場合は,
r[RET]
とします.
もし,引数をつけたいならば,
r 引数[RET]
とします.
いきなり実行すると,プログラムが終了するか,Segmentation Faultなどが
発生するまでプログラムが進行します.
- いきなり実行しないで,プログラムを少しずつ進めて行きたい場合は,まず
どこで止めたいか,を指定します.(最初から1行ずつ進んでいくと面倒くさ
いので) これを指定するのに,ソースの方で,止めたい行でCTRL-x+[Space]を
押します.すると,gdbの方の画面で
Breakpoint 1 at 0x1105c: file foobar.c, line 127.
というように表示されます.このように,ここに来たら止める,ということ
をするのをブレークポイントを設定するといいます.
ブレークポイントは何個設定しても構いませんし,解除することも出来ます.
デバッガはプログラムを実行し,ブレークポイントの行を実行する寸前で止
まって待ち状態((gdb)が出ている状態)になります.
ちなみに,(gdb)が出ている時には,いつでもブレークポイントを設定できま
す.(当然ブレークポイントで止めて,別のブレークポイントを設定すること
もできます)
では,適当なところでブレークポイントを設定して 4.のように実行を開始し
ます.
- 実行開始後,ブレークポイントで止まった場合は,
Breakpoint 1, main (argc=1, argv=0xeffffa1c) at foobar.c:127
というような表示が出て,プロンプトが表示されます.
ソースの方を見てみると,その行の左端に"=>"と表示されています.
この"=>"は表示されているだけで,プログラム自体は変更されていません.
- ブレークポイントで止まったときに出来ることはたくさんあります.ここで
はそのうち,もっとも初歩的なものを説明します.
- p 変数名 ( print 変数名 )
変数の内容を表示します.多分一番使うコマンドでしょう.変数がポインタの場合は,
p *変数名
とすると,ポインタの先の中身を表示してくれます.さらに,
p foo(1234)
などとすると,fooという関数を引数1234で呼んだときの結果を表示してく
れたりします.ただ,この過程でSegmentation Faultなどを起こすと面倒に
なるので,あまりお勧めしません.
p 1234+23454
とかすると,計算もしてくれます.ここの変数を利用することも出来ます.
ただし,#defineで定義したものは使えません.
例;
(gdb) p 1234+12431245
$1 = 12432479
(gdb) p $1
$2 = 12432479
このように,表示するときに,左に$1などと出ていますが,これを変数とし
て利用することも出来ます.
(gdb) p $1/2
$3 = 6216239
- where
現在,どこを実行中かを関数レベルで表示します.下に表示されている関数
がその上に表示している関数を呼び出して,そのなかの現在位置にいること
がわかります.例えば,以下のように表示された場合,
#0 foo (a=1, b=0xeffffa1c) at foobar.cpp:136
#1 0x1106c in main (argc=1, argv=0xeffffa1c) at foobar.cpp:127
現在fooという関数にいる.fooは引数 a = 1,b(多分ポインタ)=0xeffffa1c
で呼び出された.呼び出したのは,#1のmain関数で,main関数はargc=1,
argv=0xefffa1c で呼び出された.
ということがわかります.
さて,さきほどのpコマンドですが,ここではfoo関数の中で見える変数しか
表示することが出来ません.mainではどういう状態になっているか知りたい
ような場合にはこのままでは出来ません.こういうときに,up/downというコ
マンドを使用します.
- up
whereで表示される現在位置を変化させます.upと一回やると呼び出し元の関
数に現在表示位置を変更します.プログラムが現在止まっている場所は動い
ていません.ただ,表示される場所が一つ上になるだけです.
これによって,一段上の関数の変数などを参照できます.
ソースの表示も一段上の関数の表示になります.
当然,さらに呼び出し元の関数がある場合には繰り返しupすることが出来ま
す.
- down
upの反対です.ブレークポイントなどで止まった瞬間はそこより上の関数し
かないので,upしか出来ませんが,upしたあとでもとの場所に戻りたいとき
に使用します.一段下がります.
- s (step)
プログラムを一行進めます.関数がある場合には,その関数の中に表示を移
して,そこでも止まります.
- n (next)
プログラムを一行進めます.関数がある場合には,その関数を実行して次の
行に移ります.
関数の中まで追い掛けたいときはsを,関数がなにをするかわかっていて,い
ちいちその中の処理まで追い掛けたくないときはnを使用します.
- c (cont/continue)
プログラムの実行を継続します.次にブレークポイントなどがあるまで連続
してプログラムを実行します.
- info b (info breakpoint)
今設定しているブレークポイントの一覧を表示します.
- ・d (delete)
今設定されているすべてのブレークポイントを解除します.
- d ## (delete ##)
##番目のブレークポイントを解除します.##は数字で指定します.複数指定
することも可能です.
例 2,4,8の3つのブレークポイントを解除する場合
(gdb) d 2 4 8[RET]
- (gdb)プロンプトに続けて,何も打たずに[RET]すると,直前のコマンドを再
度実行します.一行ずつ実行するのに n[RET]n[RET]n[RET]n[RET]とずっとや
るのが面倒くさいときに,n[RET][RET][RET][RET][RET]…とやることができ
ます.
- display 変数名
(gdb)プロンプトを表示するたびに,その変数を表示するようにします.すっ
とチェックしたい変数がある場合に便利です.
表示を消したい場合には,
undisplay 変数名
とします.
- help
ヘルプです.
help コマンド名
で,コマンドの説明も出てきます.関連するコマンドも出てきます.
help breakpoint
でブレークポイント関連のコマンド一覧が表示されます.
ただし,英語です.
- q (quit)
gdbを終了します.
- r または r 引数
再度最初から実行します.
The program being debugged has been started already.
Start it from the beginning? (y or n)
と聞かれます.最初から再度実行したければyを,やめたければnを押しましょ
う.
戻る