« ロートレック展 | トップページ | make »

2008年3月 7日 (金)

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って入力すればいいのかな。

では、また。

|

« ロートレック展 | トップページ | make »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/207693/40403436

この記事へのトラックバック一覧です: gdb:

« ロートレック展 | トップページ | make »