ファイヤープロジェクト
とにかくちょっと使ってみる
2003-07-20T15:13+09:00   matsu
gdbをとにかくちょっと使ってみた.
gdbはどんな風に使用するのか,簡単な使用方法を通して示してみたい.まず以下のようなソースがあるとする.
とくにどうってことのないソースである.で,これをコンパイルする.
$ gcc intro.c
$ ls -l a.out 
-rwxr-xr-x    1 hoge    hoge        5276  4月 28 18:16 a.out
そして実行.
$ ./a.out 
Usage ./a.out loop-max
$ ./a.out 3
i = 0
i = 1
i = 2
これもどうってことがないのだが,このプログラムを実行する様子をgdbで追ってみたい.そのためにはコンパイル時にオプションとして-gを指定する.
$ gcc -g intro.c
$ ls -l a.out 
-rwxr-xr-x    1 hoge    hoge       17752  4月 28 18:17 a.out
-gオプションによってデバッグのための情報分,実行ファイルのサイズが大きくなっている.
では,gdbを起動してみる.
$ gdb a.out
すると(gdb)というgdbのプロンプトが表示される.ここでrunとすると実行を開始する.
(gdb) run
Starting program: /home/hoge/programing/c/learn-gdb/intro/a.out 
Usage /home/hoge/programing/c/learn-gdb/intro/a.out loop-max

Program exited with code 01.
今回のサンプルでは起動時に引数を渡す必要があるので,runだけだとEXIT_FAILUREで終了した.こんどは引数を渡してみる.
(gdb) run 2
Starting program: /home/hoge/programing/c/learn-gdb/intro/a.out 2
i = 0
i = 1

Program exited normally.
こんどは引数で指定した回数分printfして正常終了した.ではgdbを終える.
(gdb) quit
上ではgdbの起動時に実行ファイルを指定したが,他の方法もある.
$ gdb
(gdb) file a.out 
Reading symbols from a.out...done.
(gdb) run
Starting program: /home/hoge/programing/c/learn-gdb/intro/a.out 
Usage /home/hoge/programing/c/learn-gdb/intro/a.out loop-max

Program exited with code 01.
(gdb) quit
また,引数の渡し方もrunに直接渡すのではなく
set args
で指定することもできる.
$ gdb a.out 
(gdb) set args 2
(gdb) show args
Argument list to give program being debugged when it is started is "2".
(gdb) run
Starting program: /home/hoge/programing/c/learn-gdb/intro/a.out 2
i = 0
i = 1

Program exited normally.
(gdb) quit
上のように設定した引数は
show args
で確認できる.
gdbのプロンプトでShellコマンドを実行することができる.
(gdb) shell echo hoge
hoge
また,Shellモードになったりもできる.
(gdb) shell
$ exit
exit
(gdb) 
runしたときにgdbの起動引数やfileコマンドで指定したファイルのタイムスタンプが変わっているとgdbはそのファイルを再読み込みする.このとき後述するbreakポイントなどは保持しようとする.
$ gcc intro.c
$ gdb a.out 
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i386-linux"...(no debugging symbols found)...
(gdb) break main
Breakpoint 1 at 0x80484b6
(gdb) run
Starting program: /home/hoge/programing/c/learn-gdb/intro/a.out 
(no debugging symbols found)...(no debugging symbols found)...
Breakpoint 1, 0x080484b6 in main ()
(gdb) cont
Continuing.
Usage /home/hoge/programing/c/learn-gdb/intro/a.out loop-max

Program exited with code 01.
(gdb) shell gcc -g intro.c 
(gdb) run
`/home/hoge/programing/c/learn-gdb/intro/a.out' has changed; re-reading symbols.
Breakpoint 1 at 0x80484b6: file intro.c, line 9.
Starting program: /home/hoge/programing/c/learn-gdb/intro/a.out 

Breakpoint 1, main (argc=1, argv=0xbffff704) at intro.c:9
9         if(argc != 2){
(gdb) cont
Continuing.
Usage /home/hoge/programing/c/learn-gdb/intro/a.out loop-max

Program exited with code 01.
(gdb) quit
上の例は,ストーリーとしてはgccしてgdbに書けてみたけど,シンボル情報がないと言われたので,もう一回コンパイルしてrunしたら実行ファイルがリロードされてbreakポイントはちゃんと保持されていたというものである.
matsu(C)
Since 2002
Mail to matsu