gdb

gdbの使い方

gdb に関してはginoueさんとこがポイントを抑えてまとまっている。
旧:http://home.catv.ne.jp/pp/ginoue/debug/gdb.html
新:http://www.sepia.dti.ne.jp/inoue/debug/gdb.html

ファイヤープロジェクトでは初心者にもわかりやすく、よりつっこんだ使い方まで説明されている。
http://www.fireproject.jp/feature/gdb/index.html
マニュアルの日本語訳はここにある5.0のが最新だろうか。
http://www.coins.tsukuba.ac.jp/~syspro/gdb-5.0-doc/gdb-ja_toc.html
gcc+gdbによるプログラムのデバッグ
http://rat.cis.k.hosei.ac.jp/article/devel/index.html

ginoueさんのところに書かれているのに加えて、これはぜひおさえておきたい:

  • 配列の中身を一度に表示する
int* ary = malloc(sizeof(int)*10);
(gdb) p *ary@10		# aryの先頭から10個
(gdb) p ary[0]@10	# ary[0]から10個
(gdb) p ary[4]@3	# ary[4]から3個
  • ループを抜ける
1 for (i=0; i<100; i++) {
2	  a[i] = i;
3 }
となっているとき、1行目で until とするとこのループを抜ける。
  • 実行制御系のコマンドをVisualStudioの言葉に置き換えると:
s
ステップイン
n
ステップオーバー
fin
ステップアウト
adv {func|line}
指定行の前まで実行
  • printf
(gdb) printf "hoge=%d\n", hoge

文字列を表示するユーザ定義コマンドをつくって ~/.gdbinit に書いておくと便利かも。

define ps
    printf "%s\n", $0
end

[追記:2006-08-28]
上は x/s hoge でもできる。

  • ./.gdbinit

実行時に./.gdbinitも読み込まれる。ここに

b debuggie.c:29

などと書いておくと毎回ブレークポイントが設定されるので便利。

TUI

最近の gdb には -tui というオプションがあるらしい。
curses を使ったインターフェイスで、ソースを表示しながら gdb を実行できるというもの。
ちょっと使ってみたが、まだ不安定な機能のようだ。
以下ちょっと注意点:

  • ソースの改行コードがCRLFになっていると、ソース表示がおかしくなってしまう。LFにすること。
  • .inputrcでC-jがaccept-line以外にバインドされていると、EnterもC-mも効かなくなってしまうので注意。
  • すぐにソース表示がおかしくなるので頻繁にC-lで再描画が必須。

病的ソフトウェア

ginoue さんは gdb を「病的ソフトウェア」と書いているが、私も同感です。
オライリーの「GDBハンドブック」の表紙はトカゲだが、いかにも gdb らしいと思う。
なお、この本は参照性が悪く、特につっこんだ使い方が解説されているわけでもないので、買う必要はまったくないと思います。

dlopen()で読み込んだ共有ライブラリにブレークポイントを設定するには

http://d.hatena.ne.jp/pyopyopyo/20041112/p1