はじめに
本稿は Windows 上の emacs において Python デバッガである pdb を使えるようにした際の備忘録である.
RealGud をインストールする
M-x package-refresh-contents RET (to refresh your package database)
M-x package-install RET realgud RET (to install and compile `realgud` and its dependencies)
以下の文章では RealGud のインストールフォルダである
/home/.emacs.d/elpa/realgud-20160829.1821
をカレントフォルダとする.
pdb 起動時のデフォルト引数をフルパスから相対パスに変更する
ファイル ./realgud/common/core.el において,関数定義 (defun realgud-suggest-invocation ... の中の
(setq filename (realgud:suggest-file-from-buffer lang-str))
(concat debugger-name " " (shell-quote-argument filename)))
という部分を次のように変更する.
(setq filename (realgud:suggest-file-from-buffer lang-str))
(setq filename (first (last (split-string filename "/")))) ;; <= 追加
(concat debugger-name " " (shell-quote-argument filename)))
その後,M-x byte-compile-file により core.el ファイルをコンパイルする.
- この関数の呼ばれ方.
realgud:pdb(./realgud/debugger/pdb/pdb.el)
-> realgud:run-debugger(./realgud/common/run.el)
-> pdb-query-cmdline(./realgud/debugger/pdb/core.el) (as a callback function)
-> realgud-query-cmdline(./realgud/common/core.el)
-> pdb-suggest-invocation(./realgud/debugger/pdb/core.el) (as a callback function)
-> realgud-suggest-invocation(./realgud/common/core.el)
- 注意.
この修正は必須ではないがフルパスで実行するには Windows 形式にて,
次のように打たなければならず非常に面倒である.
Run pdb (like this): pdb c:\\Users\\...\\hoge.py
pdb 実行時の引数をフォルダ区切り(/)のフルパスに自動変換するのをやめる
ファイル ./realgud/common/run.el において,関数定義 (defun realgud:run-debugger ... の中の
(realgud:run-process debugger-name script-name parsed-cmd-args
minibuffer-history no-reset)
という部分を次のように変更する.
(realgud:run-process debugger-name script-name
cmd-args ;; <= パースしない
minibuffer-history no-reset)
その後, M-x byte-compile-file により run.el ファイルをコンパイルする.
- この関数の呼ばれ方.
realgud:pdb(./realgud/debugger/pdb/pdb.el)
-> realgud:run-debugger(./realgud/common/run.el)
ソースファイルを別のバッファに開くためにパスの表記を変更する
ファイル ./realgud/common/file.el において,関数定義 (defun realgud:file-loc-from-line ... の中の
(setq remapped-filename
buffer-file-name
(compilation-find-file (point-marker) filename directory)))
という部分を次のように変更する.
(setq filename (first (last (split-string filename "\\\\")))) ;; <= 追加
(setq remapped-filename
buffer-file-name
(compilation-find-file (point-marker) filename directory)))
その後, M-x byte-compile-file により file.el ファイルをコンパイルする.
-
デバッガが実行されコマンドバッファが開くと Realgud-Track モードに入る.
すると関数 realgud-track-mode-setup (./realgud/common/track-mode.el) が実行され
comint-output-filter-functions API (コマンドバッファのイベント発生時に実行される関数)
に realgud-track-comint-output-filter-hook (./realgud/common/track.el) がフックされる.
これによりコマンドバッファ上のイベントに付随してソースバッファが書き換えられていく. -
この関数の呼ばれ方.
イベント発生
-> realgud-track-comint-output-filter-hook(./realgud/common/track.el)
-> realgud:track-from-region(./realgud/common/track.el)
-> realgud-track-loc(./realgud/common/track.el)
-> realgud:file-loc-from-line(./realgud/common/file.el)
ソースファイル上でブレークポイントを打った際に正しく動作するように修正する
ファイル ./realgud/common/send.el において,関数定義 (defun realgud-expand-format ... の中の
(setq fmt-str (substring fmt-str (match-end 2))))
という部分を次のように変更する.
(setq result
(replace-regexp-in-string "/" "\\\\"
(replace-regexp-in-string "/c" "c:"
result)))
;; <= 追加
(setq fmt-str (substring fmt-str (match-end 2))))
その後, M-x byte-compile-file により send.el ファイルをコンパイルする.
- この関数の呼ばれ方.
ソースファイル上で "b"
-> realgud:cmd-break(./realgud/common/cmds.el)
-> realgud:cmd-run-command(./realgud/common/cmds.el)
-> realgud-command(./realgud/common/send.el)
-> realgud-expand-format(./realgud/common/send.el)
おわりに
以上の変更によってソースを見ながらブレークポイントを打てるようになったので,満足.