gdb
へっぽこプログラマである僕ですが、最近使うようになったのが、gdbです。へっぽこでしょ。デバッガーには苦手意識を持っていたのですが、使い始めてみて、すっかり気に入りました。機能が良く分っていないと、やっぱり好きになれませんね。内面が大事ですよ。
というわけで、gdbに関するメモ
- 対象プログラムは、-gオプションつきでコンパイルすること
- まず、以下のようにgdb起動すること
$ gdb targetprg
色々表示される
(gdb) ←gdbのコマンドプロンプト
- プログラムを走らせるのは、run(r)コマンドを使う。コマンドラインオプションも指定できる。ほとんど(全部?)のコマンドは1文字に省略できる。runコマンドなら、rで良い。括弧内が省略形。
(gdb) run options
- これだと、プログラムが普通に動きだして終わるだけなので、途中でとめるためにはbreak(b)を使ってあらかじめブレークポイントを設定しておく。
(gdb) break 100 # 100行目でストップさせる
(gdb) break source.c:23 # ソースファイルsource.cの23行目でストップさせる。
(gdb) break function # 関数functionに入ったところでストップさせる。
- プログラムを1行ずつ進めるためには、next(n)コマンドを使う
(gdb) next
- nextコマンドだと、関数を呼び出すとき、その関数の中まで入って見に行かない。中に入ってみたい場合は、step(s)コマンドを使う
(gdb) step
- 次のブレークポイントまで一気に進めたい場合は、continue(c)コマンドを使う
(gdb) continue
- 今の関数の最後まで行きたい時はfinish(f?)を使う
(gdb) finish
- 変数の値を表示したい時は、print(p)を使う。ポインタの先にある値や、アドレスや、配列(文字列)を適宜表示してくれる。
(gdb) print size_of_array
(gdb) print *pointer
(gdb) print &length
(gdb) print string
- 変数に値を設定したい時はsetを使う
(gdb) set number_of_books = 10
(gdb) set array[0] = 1
(gdb) set array[1] = 2
# 配列を一気に設定できるのかしら?
- 関数から、指定した返り値で抜けたい時はreturnを使う
(gdb) return 100
- Ctrl-pやCtrl-nなどのemacs系というか、bash系のキーバインドで履歴検索やコマンド編集ができる
- 単純にenterを押すと、前のコマンドが入力されたことになる。(next連打とかで役に立つ)
- 他にも、条件付breakとかあるみたいだけど、うまく使いこなせてません。
(gdb) break xxx if index == 4
gdbを使って萌えるのは、printコマンド、setコマンド、returnコマンドですね。あー、ここでこの変数の値何が入ってるんだろう?とか、あー、ここでこの変数にこの値が入ってたらどうなるだろう?とか、あーこの関数からこの値を返したら、呼び側ではどう動作するんだろう?とか、萌えます。
例によって良くわからないこともメモ
- -g オプションにはどんな意味がある?バイナリにソースを埋め込んでいる?それとも、ソースファイルへのリンクを埋め込んでいる?バイナリよりもソースが新しくなってるとかってメッセージが出てた気がするのだけど。。。
- 一行戻るとかできない?将棋の待ったみたいに。。。
- 関数の返り値を変数に代入して、その変数でエラー判定をしている場合、その変数を表示できなかった。これは-Oによる最適化のせい?(変数に入れずに返り値を直接判定するような最適化をしている?)
- stepの使い方がイマイチ分らない。関数の呼び出し行が表示されたところで、nではなくsって入力すればいいのかな。
では、また。
| 固定リンク
この記事へのコメントは終了しました。


コメント