gdbを使える人、gdbを使えない人(あまり使ったことがない人)が居るチームの中で、後者に対してどうやってgdbを身につけてもらうか、を考えました。教える側の目線です。
#初めに注意すること
##コマンド一覧をいきなり覚えない、覚えさせない
コマンド一覧を渡して使ってみてね、はやらない。初心者は何から覚えて何をやればいいのかわからなくなる。厳選してもダメ、何のために使うか、という目的と一致しないとなかなか覚えられない。
##emacsで使うようにする
listでソースコードを表示させる、を覚えるくらいならemacsで使えるようになった方がよい。
emacsを開いた後
M-x, gdb [Enter]
プログラム名
#実践する
##Segmentation Faultするプログラムをデバッグする
無ければサンプルプログラムを作ればよい。
###そのまま走らせてSEGV停止させてみる
(gdb) r // 実行
↓
SEGV発生
↓
(gdb) bt // バックトレース表示
↓
(gdb) up // 1階層上へ。逆はdown
↓
(gdb) p 変数 //変数内容を表示。p/xとすると16進表示
↓
(gdb) q // 終了
あたりをやる。
SEGV前にbreakさせてみる
SEGVになる直前やその原因を作ったと思われる関数にbreak pointを張る。
ここで覚えるのは以下
// break関連
(gdb) b // 現在位置にbreakを張る。rで再実行したらそこで止まる
(gdb) b func // 関数funcの入り口にbreakを張る
(gdb) b xxx.c:123 /// ソースファイルの指定行にbreakを張る
emacsでCtrl+space カーソルがある行にbreakを張る
// その他コマンド
(gdb) n // 次の実行行へ。関数があったら中に入らない
(gdb) s // 次の実行行へ。関数があったら中に入る
(gdb) p value=xxx // valueにxxxを入れる。SEGVにならない変数に書き換えたり
(gdb) c // 現在位置から再実行
// 場合によっては使う?
(gdb) u // ループからなかなか抜けられない時に
#補足
省略したが以下は押さえておく。
・gccでコンパイルするときは-gオプション
以下も実行環境によっては必要
・SIGUSR1などで止まる場合は.gdbinitに無視する記述を追加(予め配布する)
#最後に
個人的にはこれで十分使えてますし、以降は「じゃあこういうことは出来ないのか?」ということになり、自分で調べるか聞いてくるか、になると思います。