* GDBの使い方 [#i588a9bd]

参考URL
- [[ファイヤープロジェクト GDB:http://www.h7.dion.ne.jp/~matsu/feature/gdb/]]
- [[テクニカルノウハウ gdbの使い方(その1):http://www.j.dendai.ac.jp/~mouri/prog2/tech/gdb/gdb1.html]]

gdb でデバッグしていて、ソースコードが表示されない場合、対象プログラムが、-g オプション指定でコンパイルされているか、確認をする。-g オプションは、デバッグ情報を追加するための、オプションである。

** 我流使用法 [#w92b8cec]
参考URL
- [[GDBの使い方:http://www2u.biglobe.ne.jp/~netoasis/pickup/gdb/gdb_use.htm]]
- [[回復不能なスタックオーバーフロー:http://www.beasys.co.jp/cs/support_news/product_troubleshooting/StackOverFlow_Pattern.html]]

*** バグ箇所の発見 [#p4b4e971]
 $ gdb [exefile]
 (gdb) break [function]
 (gdb)  run (args)
 (gdb)  s 5
 (gdb)  s
 (gdb)  s

動作を確認したい関数へ breakpoint を貼り、ソースコードを一行ずつ実行していく。

 $ gdb [exefile]
 (gdb)  run (args)
  ..Some Error Message..
 (gdb)  

エラーや例外で停止する場合は、とにかく run で実行をして、出力されるエラーメッセージを、ソースファイル名と行数が書かれているか、確認する。

 $ gdb [exefile]
 (gdb) break main
 (gdb)  run (args)
 (gdb)  s 1000
 (gdb)  s 100
 (gdb)  s
 (gdb)  ...

ソースなどの情報が表示されない場合は、恐らくデバッグ情報なしのライブラリを使用している。この場合は、main などに breakpoint を貼り、ステップ実行で問題箇所の当たりを付けていく。

*** コア再現 [#j1c0046e]
コアを吐くエラーの場合は、下記のようにして、再現ができる。

 gdb -c corefile exefile

その後、whereコマンドで、エラー状態をスタック形式で見ることが出来る。

 (gdb) where

上から順に読み進み、問題が発生していると思われる箇所を、特定する。

** 各種コマンド [#od13d7c8]
*** breakの使い方 [#a3fcd7e3]

 (gdb)  break <クラス名>::<関数名>
 (gdb)  break <ファイル名>:<行番号>
 (gdb)  break <ファイル名>:<関数名>

breakpoint が貼れない場合、一度 run を実行すると、貼れる場合がある。良く利用するのは、関数名による指定。他は、ファイル名:行番号。

更に細かく見る場合は、メモリアドレスを直接指定する。余程のことがない限り、使わない。

 (gdb)  break *{アドレス}   
※"*"を忘れずに

breakpoint の削除は、以下のコマンドを使う。
 (gdb)  delete

breakpoint の一覧は、以下のコマンドを使う。
 (gdb)  info breakpoints

*** continue [#y5f5d9af]
複数 breakpoint を貼った、或いは複数回呼ばれる場合、次の breakpoint 呼び出しまでの処理を、一気に行なう。途中に無限ループがある場合は、処理が戻らないので注意。

複数の関数をデバッグする際に、次の breakpoint まで移動するために利用する。

*** print [#y6bd3f36]
各変数の値などを表示する。ポインタ変数の場合は、先頭に"*"を付加することで、
実際の中身が表示される。キャストをして、表示することも出来る。
 (gdb)  p <変数名>

実際には以下のように書く。
 (gdb)  p num
 (gdb)  p *struct

*** set [#y94909bc]
変数に、値の設定が出来る。エラー箇所にて、もし別の値が設定されていた場合、どういう挙動をするか、確認したい場合に、時々利用する。

*** watch [#ga41dd82]
 (gdb)  watch <変数名>

指定した変数の値が変化すると、通知する。あまり活用はしていない。

** その他の活用方法 [#o0705742]
 (gdb)  p <変数名>

変数のメモリアドレスが表示される。
 (gdb)  p *<アドレス>

そのアドレスの値を表示することで、スコープ外でもメモリ上の値を参照できる。知らぬ間にメモリ上の内容が破壊されてるケースで、有効。

---- 
*** 履歴 [#zff711b0]
** 履歴 [#zff711b0]
- 2005/09/12 初版

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS