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