dape
dape copied to clipboard
Debug Adapter Protocol for Emacs
#+title: Dape - Debug Adapter Protocol for Emacs #+author: Daniel Pettersson #+property: header-args :results silent #+language: en
=Dape= is a debug adapter client for Emacs. The debug adapter protocol, much like its more well-known counterpart, the language server protocol, aims to establish a common API for programming tools. However, instead of functionalities such as code completions, it provides a standardized interface for debuggers.
To begin a debugging session, invoke the ~dape~ command. In the minibuffer prompt, enter a debug adapter configuration name from ~dape-configs~.
For complete functionality, make sure to enable ~eldoc-mode~ in your source buffers and ~repeat-mode~ for more pleasant key mappings.
- Features
- Batteries included support (~describe-variable~ ~dape-configs~)
- Log breakpoints
- Conditional breakpoints
- Variable explorer
- Variable watch
- Variable hover with ~eldoc~
- REPL
- gdb-mi.el like interface
- Memory editor with ~hexl~
- Integration with ~compile~
- Debug adapter configuration ergonomics
- No external dependencies outside of core Emacs
With ~(setq dape-buffer-window-arrangement 'right)~: [[https://raw.githubusercontent.com/svaante/dape/resources/dape_0_4_0_right.png]] And with ~(setq dape-buffer-window-arrangement 'gud)~ + =corfu= as ~completion-in-region-function~: [[https://raw.githubusercontent.com/svaante/dape/resources/dape_0_4_0_gud.png]] And with minibuffer config hints: [[https://raw.githubusercontent.com/svaante/dape/resources/dape_0_4_0_hint.png]]
Screenshots taken with [[https://git.sr.ht/~protesilaos/modus-themes][modus-operandi-tinted]].
- Configuration =Dape= includes pre-defined debug adapter configurations for various programming languages. Refer to ~dape-configs~ for more details. If =dape= doesn't include a configuration suitable for your needs, you can implement your own.
#+begin_src emacs-lisp (use-package dape :preface ;; By default dape shares the same keybinding prefix as `gud' ;; If you do not want to use any prefix, set it to nil. ;; (setq dape-key-prefix "\C-x\C-a")
:hook
;; Save breakpoints on quit
;; ((kill-emacs . dape-breakpoint-save)
;; Load breakpoints on startup
;; (after-init . dape-breakpoint-load))
:init
;; To use window configuration like gud (gdb-mi)
;; (setq dape-buffer-window-arrangement 'gud)
:config
;; Info buffers to the right
;; (setq dape-buffer-window-arrangement 'right)
;; Global bindings for setting breakpoints with mouse
;; (dape-breakpoint-global-mode)
;; To not display info and/or buffers on startup
;; (remove-hook 'dape-on-start-hooks 'dape-info)
;; (remove-hook 'dape-on-start-hooks 'dape-repl)
;; To display info and/or repl buffers on stopped
;; (add-hook 'dape-on-stopped-hooks 'dape-info)
;; (add-hook 'dape-on-stopped-hooks 'dape-repl)
;; Kill compile buffer on build success
;; (add-hook 'dape-compile-compile-hooks 'kill-buffer)
;; Save buffers on startup, useful for interpreted languages
;; (add-hook 'dape-on-start-hooks (lambda () (save-some-buffers t t)))
;; Projectile users
;; (setq dape-cwd-fn 'projectile-project-root)
)
#+end_src
- Differences with dap-mode Dape has no dependencies outside of core Emacs packages, and tries to use get as much out of them possible.
Dape takes a slightly different approach to configuration.
- =Dape= does not support ~launch.json~ files, if per project configuration is needed use ~dir-locals~ and ~dape-command~.
- =Dape= enhances ergonomics within the minibuffer by allowing users to modify or add PLIST entries to an existing configuration using options. For example ~dape-config :cwd default-directory :program "/home/user/b.out" compile "gcc -g -o b.out main.c"~.
- No magic, no special variables like =${workspaceFolder}=. Instead, functions and variables are resolved before starting a new session.
- Tries to envision how debug adapter configurations would be implemented in Emacs if vscode never existed.
- Supported debug adapters In theory all debug adapters should be compatible with =Dape=.
** Javascript - vscode-js-*
- Install =node=
- Visit https://github.com/microsoft/vscode-js-debug/releases/ and download the asset =js-debug-dap-
.tar.gz= - Unpack ~mkdir -p ~/.emacs.d/debug-adapters && tar -xvzf js-debug-dap-
.tar.gz -C ~/.emacs.d/debug-adapters~
For more information see [[https://github.com/microsoft/vscode-js-debug/blob/main/OPTIONS.md][OPTIONS.md]].
** Go - dlv See [[https://github.com/go-delve/delve/tree/master/Documentation/installation][delve installation]]. For more information see [[https://github.com/go-delve/delve/blob/master/Documentation/usage/dlv_dap.md][documentation]].
** C, C++, Rust, and more - GDB Ensure that your GDB version is 14.1 or newer. For further details, consult the [[https://sourceware.org/gdb/current/onlinedocs/gdb.html/Debugger-Adapter-Protocol.html][documentation]].
** C, C++ and Rust - codelldb
- Download latest =vsix= [[https://github.com/vadimcn/codelldb/releases][release]] for your platform =codelldb-
- .vsix= - Unpack ~mkdir -p ~/.emacs.d/debug-adapters && unzip codelldb-
- .vsix -d ~/.emacs.d/debug-adapters/codelldb~
See [[https://github.com/vadimcn/codelldb/blob/v1.10.0/MANUAL.md][manual]] for more information.
** C and C++ - cpptools Download latesnd unpack =vsix= file with your favorite unzipper.
- Download latest =vsix= [[https://github.com/microsoft/vscode-cpptools/releases][release]] for your platform =cpptools-
- .vsix= - Unpack ~mkdir -p ~/.emacs.d/debug-adapters && unzip cpptools-
- .vsix -d ~/.emacs.d/debug-adapters/cpptools~ - Then ~chmod +x ~/.emacs.d/debug-adapters/cpptools/extension/debugAdapters/bin/OpenDebugAD7~
- And ~chmod +x ~/.emacs.d/debug-adapters/cpptools/extension/debugAdapters/lldb-mi/bin/lldb-mi~
See [[https://code.visualstudio.com/docs/cpp/launch-json-reference][options]].
** Python - debugpy Install debugpy with pip ~pip install debugpy~
See [[https://github.com/microsoft/debugpy/wiki/Debug-configuration-settings][options]].
** Godot Configure debug adapter port under "Editor" > "Editor Settings" > "Debug Adapter".
** Dart - flutter See for installation https://docs.flutter.dev/get-started/install
** C# - netcoredbg See https://github.com/Samsung/netcoredbg for installation
** Ruby - rdbg Install with ~gem install debug~.
See https://github.com/ruby/debug for more information
** Java - JDTLS with Java Debug Server plugin See https://github.com/eclipse-jdtls/eclipse.jdt.ls for installation of JDTLS. See https://github.com/microsoft/java-debug for installation of the Java Debug Server plugin. The Java config depends on Eglot running JDTLS with the plugin prior to starting Dape. Extend ~eglot-server-programs~ as follows to have JDTLS load the plugin: #+begin_src emacs-lisp (add-to-list 'eglot-server-programs `((java-mode java-ts-mode) . ("jdtls" :initializationOptions (:bundles ["/PATH/TO/java-debug/com.microsoft.java.debug.plugin/target/com.microsoft.java.debug.plugin-VERSION.jar"])))) #+end_src
** Other untested adapters If you find a working configuration for any other debug adapter please submit a PR.
See [[https://microsoft.github.io/debug-adapter-protocol/implementors/adapters/][microsofts list]] for other adapters, your mileage will vary.
- Contribute =dape= is subject to the same copyright assignment policy as GNU Emacs.
Any legally [[https://www.gnu.org/prep/maintain/html_node/Legally-Significant.html#Legally-Significant][significant]] contributions can only be merged after the author has completed their paperwork. See [[https://www.fsf.org/licensing/contributor-faq][Contributor's Frequently Asked Questions (FAQ)]] for more information.
-
Bugs and issues Before reporting any issues ~(setq dape-debug t)~ and take a look at =dape-repl= buffer. Please share your =dape-repl= and =dape-connection events= in the buffer contents with the bug report. The =master= branch is used as an development branch and releases on elpa should be more stable so in the mean time use elpa if the bug is a breaking you workflow.
-
Acknowledgements Big thanks to João Távora for the input and jsonrpc; the project wouldn't be where it is without João.