Emacs + GDB チートシート

Emacs + GDB を利用したいならば、何よりも GNU Emacs Manual: Debuggers(英語) を読むことを強くおすすめします。
和訳も存在しますが内容が古く、マウスを利用した操作やグラフィカルな機能についての記述がありませんでした。


マニュアルを読んで理解したあとは実践で覚えていくわけですが、以下にまとめたチートシートを利用すれば時間が節約できるかもしれません。
もしも便利な機能に関して漏れがあれば是非教えてください。

.emacs

;;; GDB 関連
;;; 有用なバッファを開くモード
(setq gdb-many-windows t)

;;; 変数の上にマウスカーソルを置くと値を表示
(add-hook 'gdb-mode-hook '(lambda () (gud-tooltip-mode t)))

;;; I/O バッファを表示
(setq gdb-use-separate-io-buffer t)

;;; t にすると mini buffer に値が表示される
(setq gud-tooltip-echo-area nil)

起動・終了

起動 M-x gdb, dbx, xdb, sdb, pdb
デバッグ終了 gdb バッファを kill (C-x k)

ブレークポイント関連

セットする c-x space
現在のソース行に一時的なブレークポイントを設定 C-x C-a C-t
一時的に diable/enable ブレークポイントバッファの該当箇所で space でトグル
削除 該当行で C-x C-a C-d
削除 ブレークポイントバッファの該当箇所で D(大文字)
セット・削除 該当赤丸をマウスでクリック
disable・enable 該当行赤丸をマウスで Ctrl + クリック
変数の変化を見るために常に表示 C-x C-a C-w

実行

Step 一行進む。関数なら入って止まる C-x C-a C-s
Next 一行進む。 C-x C-a C-n
機械語1つ実行 Instruction? C-x C-a C-i
ブレークポイントに出会うまで実行 C-x C-a C-r
現在のカーソル行まで実行 C-x C-a C-u
現在のスタックフレームを出るまで C-x C-a C-f
いきなり現在のカーソル行に実行位置 jump C-x C-a C-j
現在の位置を表す▲をドラッグ そこまで実行

スタックフレーム

1つ外側のスタックフレームを選択する C-x C-a <
1つ内側のスタックフレームを選択する C-x C-a >

バッファ操作関連

参照した最後(Last)のバッファを開く C-x C-a C-l
各種バッファを閉じる q
ブレークポイントバッファで RET 該当のブレークポイントのソース開く
レジスタの値を見る gdb-display-registers-buffer
レジスタの値を書き換える レジスタバッファで RET
アセンブラバッファを開く gdb-display-assembler-buffer
メモリバッファを開く gdb-display-memory-buffer

変数

変数の値を書き換える ローカル変数バッファで RET
struct/union/array の値を見る ローカル変数バッファで RET
変数の値を評価する C-x C-a C-p

背景

しばらく QEMU をデバッガで動かしつつ動作を確認する作業が続きそうなので Emacs + GDB をきちんとマスターすることにしました。
いろいろ調べて分かったのですが、簡単な使い方をまとめているブログは見つかりますが、冒頭に書いた通り Emacs のマニュアルを読むのが一番良さそうです。

独り言

ひょっとしたらここに書いた内容は、Debug Hacksに書いてあるかもしれません。献本いただいたのですがまだ読めていなくてごめんなさい。


あと GDB で変数が で見られない場合があるのですが

以外に良い方法無いでしょうか。前者はがんばればできるけど若干つらい、後者は時間や手間がかかるのだよなあ。


Emacs + GDB の Tips もどこかに集積したいな。

  • 配列の中身を見たいんだけど?
  • 独自の printer を定義して使いたいんだけど?(これは GDB か)

みたいな逆引きで。