とにかくちょっと使ってみる
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ポイントはちゃんと保持されていたというものである.

