* 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 初版