Emacs + GDB を利用したいならば、何よりも GNU Emacs Manual: Debuggers(英語) を読むことを強くおすすめします。
和訳も存在しますが内容が古く、マウスを利用した操作やグラフィカルな機能についての記述がありませんでした。
マニュアルを読んで理解したあとは実践で覚えていくわけですが、以下にまとめたチートシートを利用すれば時間が節約できるかもしれません。
もしも便利な機能に関して漏れがあれば是非教えてください。
(setq gdb-many-windows t)
(add-hook 'gdb-mode-hook '(lambda () (gud-tooltip-mode t)))
(setq gdb-use-separate-io-buffer t)
(setq gud-tooltip-echo-area nil)
| セットする |
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 のマニュアルを読むのが一番良さそうです。
独り言
ひょっとしたらここに書いた内容は、に書いてあるかもしれません。献本いただいたのですがまだ読めていなくてごめんなさい。
あと GDB で変数が で見られない場合があるのですが
以外に良い方法無いでしょうか。前者はがんばればできるけど若干つらい、後者は時間や手間がかかるのだよなあ。
Emacs + GDB の Tips もどこかに集積したいな。
- 配列の中身を見たいんだけど?
- 独自の printer を定義して使いたいんだけど?(これは GDB か)
みたいな逆引きで。