dotfiles/emacs.d/debugging.el
Gered 28d6f2feb4 improve and sort-of clean up dap/gdb debugging config and keymaps
the main goal here is to provide common keybinds for controlling a
debugger session between dap-mode and gdb-mi/gud ... or at least, as
common as is possible
2024-12-09 20:48:06 -05:00

104 lines
3.8 KiB
EmacsLisp

;; NOTE: the "design" of this is mainly to work around the issue of "dap-mode"
;; generally being active all of the time, while "gud-minor-mode" is only
;; active while in a gdb session. so, the preferred(?) method of setting
;; keybinds in (use-package ... :bind ...) is not really doable from what
;; i've seen.
;; setting global keybinds and using these functions to wrap high-level
;; tasks common in any debugging session is my current way to work around
;; this while providing common keybinds whether debugging via dap or gud.
(defun gered/debug-quit ()
"Quits out of the current debugging session."
(interactive)
(cond (gud-minor-mode (gud-basic-call "quit"))
(dap-mode (dap-disconnect (dap--cur-active-session-or-die)))))
(defun gered/debug-start ()
"Starts execution of the program in the current debugging session."
(interactive)
(cond (gud-minor-mode (gud-basic-call "start"))
(dap-mode nil)))
(defun gered/debug-stop ()
"Terminates execution of the running program within the current debugging session."
(interactive)
(cond (gud-minor-mode (gud-basic-call "kill"))
(dap-mode (dap-disconnect (dap--cur-active-session-or-die)))))
(defun gered/debug-continue ()
"Continued execution of the running program within the current debugging session."
(interactive)
(cond (gud-minor-mode (gud-cont 1))
(dap-mode (dap-continue (dap--cur-active-session-or-die)
(dap--debug-session-thread-id (dap--cur-active-session-or-die))))))
(defun gered/debug-step-into ()
"Steps execution to the next line."
(interactive)
(cond (gud-minor-mode (gud-step 1))
(dap-mode (dap-step-in (dap--cur-session-or-die)))))
(defun gered/debug-step-over ()
"Steps exection to the next line, skipping over functions."
(interactive)
(cond (gud-minor-mode (gud-next 1))
(dap-mode (dap-next (dap--cur-active-session-or-die)))))
(defun gered/debug-step-out ()
"Steps execution out of the current function."
(interactive)
(cond (gud-minor-mode (gud-finish 1))
(dap-mode (dap-step-out (dap--cur-session-or-die)))))
(defun gered/debug-set-breakpoint ()
"Sets a debugger breakpoint on the current line."
(interactive)
(cond (gud-minor-mode (gud-break 1))
(dap-mode (dap-breakpoint-add))))
(defun gered/debug-remove-breakpoint ()
"Removes a debugger breakpoint from the current line."
(interactive)
(cond (gud-minor-mode (gud-remove 1))
(dap-mode (dap-breakpoint-delete
(-some->> (dap--get-breakpoints)
(gethash buffer-file-name)
dap--get-breakpoint-at-point)
buffer-file-name))))
(defun gered/debug-switch-stack-frame ()
(interactive)
(cond (gud-minor-mode nil)
(dap-mode (dap-switch-stack-frame))))
(use-package gdb-mi
:config
(setq gdb-many-windows t)
(setq gdb-restore-window-configuration-after-quit 'if-gdb-many-windows)
(setq gdb-debuginfod-enable-setting nil)
(gud-tooltip-mode t))
(use-package dap-mode
:ensure t
:bind
( :map dap-mode
(("M-<prior>" . 'dap-up-stack-frame)
("M-<next>" . 'dap-down-stack-frame)))
:commands dap-mode
:init
(setq dap-auto-configure-features '(sessions locals tooltip breakpoints expressions))
:config
(use-package dap-gdb))
;; TODO: figure out something better than adding all as global keymaps?
(global-set-key (kbd "C-q") 'gered/debug-quit)
(global-set-key (kbd "<f5>") 'gered/debug-start)
(global-set-key (kbd "S-<f5>") 'gered/debug-stop)
(global-set-key (kbd "<f9>") 'gered/debug-continue)
(global-set-key (kbd "<f7>") 'gered/debug-step-into)
(global-set-key (kbd "<f8>") 'gered/debug-step-over)
(global-set-key (kbd "S-<f8>") 'gered/debug-step-out)
(global-set-key (kbd "C-c C-g b") 'gered/debug-set-breakpoint)
(global-set-key (kbd "C-c C-g B") 'gered/debug-remove-breakpoint)
(global-set-key (kbd "C-c C-g s") 'gered/debug-switch-stack-frame)