GDBの使い方

参考URL

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

我流使用法

参考URL

バグ箇所の発見

$ 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 を貼り、ステップ実行で問題箇所の当たりを付けていく。

コア再現

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

gdb -c corefile exefile

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

(gdb) where

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

各種コマンド

breakの使い方

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

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

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

(gdb)  break *{アドレス}   

※"*"を忘れずに

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

(gdb)  delete

breakpoint の一覧は、以下のコマンドを使う。

(gdb)  info breakpoints

continue

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

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

print

各変数の値などを表示する。ポインタ変数の場合は、先頭に"*"を付加することで、 実際の中身が表示される。キャストをして、表示することも出来る。

(gdb)  p <変数名>

実際には以下のように書く。

(gdb)  p num
(gdb)  p *struct

set

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

watch

(gdb)  watch <変数名>

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

その他の活用方法

(gdb)  p <変数名>

変数のメモリアドレスが表示される。

(gdb)  p *<アドレス>

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


履歴


トップ   編集 凍結解除 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2005-09-13 (火) 01:41:50