LoginSignup
11
12

More than 5 years have passed since last update.

gdbを初心者に教える最初のステップ

Last updated at Posted at 2016-12-14

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に無視する記述を追加(予め配布する)

最後に

個人的にはこれで十分使えてますし、以降は「じゃあこういうことは出来ないのか?」ということになり、自分で調べるか聞いてくるか、になると思います。

11
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
12