2022-03-28 15:03:21 +02:00
#+title : :tools debugger
2022-10-28 23:11:50 +02:00
#+subtitle : Step through code to add more bugs
2022-03-28 15:03:21 +02:00
#+created : February 20, 2020
#+since : 2.0.0
2021-10-16 01:29:27 +02:00
* Description :unfold:
2022-09-26 02:19:42 +08:00
Introduces a code debugger to Emacs, powered by [[doom-package:realgud ]] or [[doom-package:dap-mode ]] (LSP).
2021-10-16 01:29:27 +02:00
2022-09-26 02:19:42 +08:00
This document will help you to configure [[doom-package:dap-mode ]] [[https://emacs-lsp.github.io/dap-mode/page/configuration/#native-debug-gdblldb ][Native Debug(GDB/LLDB) ]] as
2021-10-16 01:29:27 +02:00
there is still not *enough* documentation for it.
** Maintainers
/This module has no dedicated maintainers./ [[doom-contrib-maintainer: ][Become a maintainer? ]]
** Module flags
- +lsp ::
Enable support for [[https://microsoft.github.io/debug-adapter-protocol/ ][Debug Adapter Protocol ]] (DAP) debuggers.
** Packages
2022-09-26 02:19:42 +08:00
- [[doom-package:realgud ]]
- [[doom-package:realgud-trepan-ni ]] if [[doom-module::lang javascript ]]
- if [[doom-module:+lsp ]]
- [[doom-package:dap-mode ]]
- [[doom-package:posframe ]]
2021-10-16 01:29:27 +02:00
2022-10-28 23:11:50 +02:00
** Hacks
- Enables ~gdb-many-windows-mode~ in ~gdb-mode~ by default
- Patches [[doom-package:realgud ]] to open in a popup window. This causes realgud
bindings to focus the command window.
- Closes [[doom-package:realgud ]]'s command buffer after the session ends.
2021-10-16 01:29:27 +02:00
** TODO Changelog
# This section will be machine generated. Don't edit it by hand.
/This module does not have a changelog yet./
* TODO Installation
#+begin_quote
2023-09-16 20:19:11 +02:00
/This module's prerequisites documentation is incomplete./ [[doom-contrib-module: ][Complete it? ]]
2021-10-16 01:29:27 +02:00
#+end_quote
[[id:01cffea4-3329-45e2-a892-95a384ab2338 ][Enable this module in your ~doom!~ block. ]]
Make sure all of these pre-requirements is in your ~$PATH~ :
- =nodejs=
- =lldb= and =lldb-mi= (optional)
- =gdb= (optional), requires =unzip=
If you are getting an error like ~Searching for program no such file or
directory "node"~, then you need [[github:nodejs/node ][nodejs ]] ([[github:emacs-lsp/dap-mode/issues/79 ][emacs-lsp/dap-mode#79 ]]).
** Realgud debuggers
*** lldb and lldb-mi
This is optional if you want to debug with [[https:lldb.llvm.org ][LLDB ]]. Install lldb and [[github:lldb-tools/lldb-mi ][lldb-mi ]].
*** gdb
This is optional if you want to debug with [[https:www.gnu.org/software/gdb/ ][GDB ]]. Install gdb.
You will need ~unzip~ for ~dap-gdb-lldb-setup~ . It downloads a VS-Code extension
and it needs to extract compressed downloaded file.
You need this if you are having ~"wrong-type-argument stringp nil"~ error when
calling ~dap-gdb-lldb-setup~ . [[github:emacs-lsp/dap-mode/issues/313 ][See emacs-lsp/dap-mode#313 ]]
** DAP debuggers
2022-10-28 23:11:50 +02:00
*** dap-cpptools
- Languages: C, C++, Rust
- Documentation
- [[https://code.visualstudio.com/docs/cpp/cpp-debug ][adapter ]]
- [[https://emacs-lsp.github.io/dap-mode/page/configuration/#vscode-cpptools ][dap-mode configuration ]]
2021-10-16 01:29:27 +02:00
2022-10-28 23:11:50 +02:00
Run =M-x dap-cpptools-setup= to setup the adapter before using it the first
time.
*** dap-gdb-lldb
- Languages: C, C++, Rust
- Documentation
- [[https://github.com/WebFreak001/code-debug ][adapter ]]
- [[https://emacs-lsp.github.io/dap-mode/page/configuration/#native-debug-gdblldb ][dap-mode configuration ]]
Install the vscode extension using =M-x dap-gdb-lldb-setup= before using it the
first time.
*** dap-lldb
- Languages: C, C++, Rust
- Documentation
- [[https://github.com/llvm/llvm-project/tree/main/lldb/tools/lldb-vscode ][adapter ]]
- [[https://emacs-lsp.github.io/dap-mode/page/configuration/#lldb ][dap-mode configuration ]]
Needs [[https://github.com/llvm/llvm-project/tree/main/lldb/tools/lldb-vscode ][lldb-vscode ]]. Install LLDB from your package manager. For example:
- *Arch Linux:* ~$ pacman -S lldb~
- *Fedora:* ~$ dnf install lldb~
*** dap-python
- Languages: Python
- Documentation:
- [[https://github.com/microsoft/debugpy/ ][adapter ]]
- [[https://emacs-lsp.github.io/dap-mode/page/configuration/#python ][dap-mode configuration ]]
By default, DAP expects [[https://github.com/Microsoft/ptvsd ][ptvsd ]] as the Python debugger, but [[https://github.com/microsoft/debugpy ][debugpy ]] is
recommended. See [[*Configuration ][Configuration ]].
2021-10-16 01:29:27 +02:00
2022-10-28 23:11:50 +02:00
*installing ptvsd and debugpy:*
2021-10-16 01:29:27 +02:00
#+begin_src sh
2022-10-28 23:11:50 +02:00
$ pip3 install ptvsd --user
$ pip3 install debugpy --user
2021-10-16 01:29:27 +02:00
#+end_src
#+begin_src emacs-lisp
;; in $DOOMDIR/config.el
(after! dap-mode
(setq dap-python-debugger 'debugpy))
2022-10-28 23:11:50 +02:00
#+end_src* TODO Usage
2021-10-16 01:29:27 +02:00
2022-10-28 23:11:50 +02:00
* Usage
Start a debugging session with ~M-x +debugger/start~ (bound to [[kbd: ][SPC o d ]] in evil).
You'll be prompted to select a debugger preset if this is the first time you've
used it. Otherwise, it will use the last preset automatically. Use the
universal/prefix argument to invoke this prompt again: [[kbd: ][SPC u SPC o d ]] or [[kbd:][C-u C-c
o d]]. The last used configuration is stored for each project individually.
2021-10-16 01:29:27 +02:00
2022-10-28 23:11:50 +02:00
~M-x +debugger/start-last~ starts the last used debug configuration, if it
exists, and prints a message otherwise instead of offering a selection.
2021-10-16 01:29:27 +02:00
2022-10-28 23:11:50 +02:00
Once the session is started, it can be terminated by ~M-x +debugger/quit~ or by
using the mode-specific way.
** TODO realgud
2021-10-16 01:29:27 +02:00
#+begin_quote
2023-09-16 20:19:11 +02:00
Instructions for realgud haven't been written yet. [[doom-contrib-module: ][Write some? ]]
2021-10-16 01:29:27 +02:00
#+end_quote
2022-10-28 23:11:50 +02:00
** dap-mode
*** How to add a debug configuration
2021-10-16 01:29:27 +02:00
1. Call ~dap-gdb-lldb-setup~ function.
2. Use ~dap-debug-edit-template~ to configure debugging settings for your
project. [[github:WebFreak001/code-debug/blob/master/package.json#L72 ][Available settings can be inspected here. ]] Call ~eval-buffer~ to save
your settings. *Don't save the file!*
3. Call ~dap-debug~ , select a configuration and start debugging.
2022-10-28 23:11:50 +02:00
*** dap-mode with ~+lsp~
2021-10-16 01:29:27 +02:00
Intuitive and powerful debugging.
- Breakpoints
- REPL
- *local variable view:* Allows you to browse variables in the current stack
frame.
- *expressions:* Add expressions to either watch variables or generic
expressions.
** Keybindings
2022-10-28 23:11:50 +02:00
*** General
| Keybind | Description |
|---------+--------------------------|
| [[kbd:][SPC o d]] | Start a debugger session |
*** dap-mode
When a dap-mode session is running, the following mappings are active:
| Keybind | Description |
|---------+----------------------------------|
| [[kbd:][SPC m d]] | Open a hydra for session control |
The hydra is defined as follows:
2021-10-16 01:29:27 +02:00
#+begin_src emacs-lisp
(map! :map dap-mode-map
:leader
:prefix ("d" . "dap")
;; basics
:desc "dap next" "n" #'dap-next
:desc "dap step in" "i" #'dap-step-in
:desc "dap step out" "o" #'dap-step-out
:desc "dap continue" "c" #'dap-continue
:desc "dap hydra" "h" #'dap-hydra
:desc "dap debug restart" "r" #'dap-debug-restart
:desc "dap debug" "s" #'dap-debug
;; debug
:prefix ("dd" . "Debug")
:desc "dap debug recent" "r" #'dap-debug-recent
:desc "dap debug last" "l" #'dap-debug-last
;; eval
:prefix ("de" . "Eval")
:desc "eval" "e" #'dap-eval
:desc "eval region" "r" #'dap-eval-region
:desc "eval thing at point" "s" #'dap-eval-thing-at-point
:desc "add expression" "a" #'dap-ui-expressions-add
:desc "remove expression" "d" #'dap-ui-expressions-remove
:prefix ("db" . "Breakpoint")
:desc "dap breakpoint toggle" "b" #'dap-breakpoint-toggle
:desc "dap breakpoint condition" "c" #'dap-breakpoint-condition
:desc "dap breakpoint hit count" "h" #'dap-breakpoint-hit-condition
:desc "dap breakpoint log message" "l" #'dap-breakpoint-log-message)
#+end_src
* TODO Configuration
#+begin_quote
2023-09-16 20:19:11 +02:00
This module has no configuration documentation yet. [[doom-contrib-module: ][Write some? ]]
2021-10-16 01:29:27 +02:00
#+end_quote
* Troubleshooting
- There is a known issue with the ~+debugger/start~ command, which is bound to
[[kbd: ][SPC o d ]] right now. It prints "No debugging session to quit" no matter what.
* Frequently asked questions
/This module has no FAQs yet./ [[doom-suggest-faq: ][Ask one? ]]
2022-10-28 23:11:50 +02:00
** Setting breakpoints in realgud does not work outside a session
This currently is not supported by realgud.
2021-10-16 01:29:27 +02:00
* TODO Appendix
#+begin_quote
2023-09-16 20:19:11 +02:00
This module has no appendix yet. [[doom-contrib-module: ][Write one? ]]
2021-10-16 01:29:27 +02:00
#+end_quote