Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
12
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

@igayu

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

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

最後に

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
12
Help us understand the problem. What are the problem?