gdbを使ってデバッグする

RubyのppとかRのstr相当のメソッドがないからC++でオブジェクトの情報がよく分からない><と言っていたらgdb使えとのコメントをもらったので、gdbやってみる。というか5回目くらいの挑戦である。id:hyoshiokさんに怒られてしまう(ぉ。

gdbの立ち上げ

gdb-many-windowsとかあるんだけど、6つのバッファとか頭悪いので多すぎて追えない。ESS*1を使っている時が3分割でこれがしっくりくるので、それ用にしておく。左がソース、右上がansi-termでzshを立ち上げ、右下でgdb。分割してバッファが小さくなってしまた!!という人はid:hayamiz先生作のwiden-window.elを入れるといいんでないか。

(defun setup-cpp ()
  "setup the buffers for cpp."
  (interactive)
  (let()
    (progn
      (split-window-horizontally)
      (other-window 1)
      (ansi-term "/opt/local/bin/zsh")
      (split-window)
      (other-window 1)
      (switch-to-buffer "*scrach*"))))

gdbを使う

とりあえず-gオプションも付けてコンパイルするとよいらしい。御利益はよく知らない。以下も間違っている可能性大ですよー!!

コマンド 説明
C-x space ブレイクポイントを設定。bとかで行数が指定できたりするらしいけど、数字入力嫌いなのです。
c ブレイクポイントまで走らせる。
p 変数を出力。/xとかを付けると何進法みたいなのを変えたりとかできるらしい。
u 一回以上実行。2回やるとループを抜けるまで一気に実行。ループの時用か。
s 一行づつ実行。関数があると中に入っていく。左のソースのほうも更新される。きめえw
n 一行づつ実行。関数の中には入らない。
display ステップ実行しているときに、毎回変数の値を自動表示してくれるすぐれもの。
whatis 変数の型を知りたい時。ptypeだと構造体の定義を参照できる。
i b 設定しているブレークポイントの一覧を表示。
l 現在実行中の付近のソースを表示。引数を与えると与えた付近を表示。

ところで

ansi-termはなんかキーバインドをきかなくてしてくれたりとかちょっと余計なことまでしてくれているので、.emacsに適当に書く。elscreenのprefix-keyをとりあえずちゃんと読むようにしておきました。

(add-hook 'term-mode-hook '(lambda ()
                             (define-key term-raw-map "\C-z"
                               (lookup-key (current-global-map) "\C-z"))))

*1:Gnu RをEmacsで使うためのもの。最強!!