プログラムdeタマゴ

nodamushiの著作物は、文章、画像、プログラムにかかわらず全てUnlicenseです

Emacsで Mozilla rr を使えるようにしてみた

 Windows野郎で未だにWSL1の情弱である私も、昨日の記事で遂に Mozilla rr が使えるようになりました。

nodamushi.hatenablog.com

 しかし、Emacsで使いにくい。Emacs用のパッケージも特に無さそう?というわけで、設定追加したので晒してみる。 -exec-reverse-continue見たいなコマンドはないっぽいけど、取りあえず、何か何とか動いてます。

 基本的には gdb を呼び出してるだけです。

  • M-x → rr : rr replayを起動
  • M-x → rr-record: rr recordを起動
  • F8: continue
  • Ctrl + F8: reverse-continue
  • F9: step
  • Ctrl + F9: reverse-step
  • F10: next
  • Ctrl + F10: reverse-next
  • F11: finish
  • Ctrl + F11: reverse-finish
(use-package gdb-mi
  :init
  (defcustom gud-rr-command-name "rr replay -i=mi"
    "Default command to execute an executable under the Mozilla rr debugger."
    :type 'string
    :group 'gdb)
  (defcustom gud-rr-record-command-name "rr record"
    "Default command to execute an executable under the Mozilla rr recode."
    :type 'string
    :group 'gdb)

  (defun rr (command-line)
    "rr replay"
    (interactive (list (gud-query-cmdline 'rr "")))
    (gdb command-line)
    (gud-def gud-reverse-next "reverse-next %p"
             "\C-r"
             "Step one line (skip functions).")
    (gud-def gud-reverse-step "reverse-step %p"
             "\C-e"
             "Step one line (skip functions).")
    (gud-def gud-reverse-continue "reverse-continue"
             "\C-w"
             "Step one line (skip functions).")
    )
  
  (defun rr-record (command-line)
    "rr record"
    (interactive (list (gud-query-cmdline 'rr-record)))
    (compile command-line))

  :config

  ;; global-display-line-numbersを有効にしてるので、変数バッファなどで無効化
  (defun my-disable-display-line-numbers (orig-func &rest args)
    (let ((r (apply orig-func args)))
      (remove-hook 'pre-command-hook #'display-line-numbers-update-width t)
      (setq display-line-numbers nil)
      r))
  (advice-add 'gud-common-init :around #'my-disable-display-line-numbers)
  (advice-add 'gdb-get-buffer-create :around #'my-disable-display-line-numbers)

  (global-set-key (kbd "<f8>") 'gud-cont)
  (global-set-key (kbd "C-<f8>") 'gud-reverse-continue)
  (global-set-key (kbd "<f9>") 'gud-step)
  (global-set-key (kbd "C-<f9>") 'gud-reverse-step)
  (global-set-key (kbd "<f11>") 'gud-finish)
  (global-set-key (kbd "C-<f11>") 'gud-reverse-finish))

f:id:nodamushi:20200702223541p:plain