Skip to content

bimbiltu/dap-mode

 
 

Repository files navigation

https://melpa.org/packages/dap-mode-badge.svg https://cdn.rawgit.com/syl20bnr/spacemacs/442d025779da2f62fc86c2082703697714db6514/assets/spacemacs-badge.svg https://travis-ci.org/yyoncho/dap-mode.svg?branch=master

Table of Contents

Summary

Emacs client/library for Debug Adapter Protocol is a wire protocol for communication between client and Debug Server. It’s similar to the LSP but provides integration with debug server.

Project status

The API considered unstable until 1.0 release is out. It is tested against Java, Python, Ruby, Elixir and LLDB (C/C++/Objective-C/Swift).

Usage

The main entry points are dap-debug and dap-debug-edit-template. The first one asks for a registered debug template and starts the configuration using the default values for that particular configuration. The latter creates a debug template which could be customized before running. dap-debug-edit-template will prepare a template deceleration inside a temporary buffer. You should execute this code using C-M-x for the changes to apply. You should also copy this code into your Emacs configuration if you wish to make it persistent.

dap-mode also provides a hydra with dap-hydra. You can automatically trigger the hydra when the program hits a breakpoint by using the following code.

(add-hook 'dap-stopped-hook
          (lambda (arg) (call-interactively #'dap-hydra)))

Screenshot

Java

screenshots/MultiSession.png

Swift

screenshots/Swift.png

RUST

screenshots/rust.png

Go

screenshots/go.png

Javascript

screenshots/javascript.png

Features

  • Launch/Attach
  • Breakpoints
  • Exceptions
  • Pause & Continue
  • Step In/Out/Over
  • Callstacks
  • Threads
  • Multiple simultaneous debug sessions
  • Evaluating statements
  • Debug/Run configurations
  • Expressions

Debugger commands

CommandDescription
dap-breakpoint-toggleToggle breakpoint at line
dap-breakpoint-deleteDelete breakpoint at line
dap-breakpoint-addAdd breakpoint at line
dap-breakpoint-conditionSet/unset breakpoint condition
dap-breakpoint-hit-conditionSet/unset breakpoint hit condition
dap-breakpoint-log-messageSet/unset breakpoint log message
dap-evalEval string
dap-eval-regionEval region string
dap-eval-thing-at-pointEval symbol at point
dap-step-inDebug step in
dap-nextDebug next
dap-step-outDebug step out
dap-stop-threadStop thread
dap-restart-frameRestart frame
dap-continueDebug continue
dap-disconnectCancel current debug session
dap-switch-stack-frameSwitch active stack frame
dap-switch-threadSwitch active thread
dap-switch-sessionSwitch active session
dap-debug-edit-templateGenerate run command
dap-debugCreate and run new configuration using the available templates
dap-debug-lastDebug previous configuration
dap-debug-recentSelect configuration to run from the previously started command
dap-go-to-output-bufferGo output buffer

Windows

CommandDescription
dap-ui-sessionsShow active/terminated sessions view
dap-ui-localsShow locals view
dap-ui-expressionsShow expressions view
dap-ui-breakpointsShow breakpoints view
dap-ui-replDAP UI REPL

Sessions

The session view is showed after invoking dap-ui-sessions . It represents the list of the active sessions.

Locals

Locals can be viewed after invoking dap-ui-locals.

Expressions

Watch expressions can be viewed after invoking dap-ui-expressions. You could add remove watch expressions via dap-ui-expressions-add and dap-ui-expressions-remove.

Breakpoints

Breakpoints can be viewed after invoking dap-ui-breakpoints.

Keybindings

CommandDescriptionKeybindings
dap-ui-breakpoints-gotoGo to breakpoint under cursor<return>
dap-ui-breakpoints-deleteDelete breakpoint under cursord
dap-ui-breakpoints-delete-selectedDelete selected breakpointsD
bui-list-markMark breakpoint under pointm
bui-list-unmarkUnmark breakpoint under pointu
bui-list-unmark-allUnmark breakpoint under pointU

Loaded sources

Loaded sources can be viewed by invoking dap-tm-loaded-sources.

DAP debug REPL

DAP provides a debug shell to execute commands when the program has hit breakpoints. The REPL has the same features as regular emacs shells (e.g. command history, C-p/n navigation through history, etc.) in addition to optional company-mode autocompletion. screenshots/dap-ui-repl.png

Configuration

DAP mode configuration

Enable both dap-mode and dap-ui-mode (requires posframe to be installed manually, available only for emacs version >= 26).

(dap-mode 1)
(dap-ui-mode 1)
;; enables mouse hover support
(dap-tooltip-mode 1)
;; use tooltips for mouse hover
;; if it is not enabled `dap-mode' will use the minibuffer.
(tooltip-mode 1)
;; displays floating panel with debug buttons
;; requies emacs 26+
(dap-ui-controls-mode 1)

After enabling DAP mode on emacs side follow the language specific settings.

Java

Installation

Latest version of LSP Java will automatically discover if dap-mode is present and it will download and install the required server side components. If you have already downloaded a Eclispe JDT Server you will have to force a server update via lsp-java-update-server. In order to enable lsp java, you will have to require dap-java.el.

(require 'dap-java)

Commands

CommandDescription
dap-java-debugDebug java
dap-java-run-test-methodRun test method
dap-java-debug-test-methodDebug test method
dap-java-run-test-classRun test class
dap-java-debug-test-classDebug test class

You can also edit one of the existing templates and execute it with dap-debug. dap-mode will take care of filling missing values, such as classpath. JVM arguments can be specified with :vmArgs:

(dap-register-debug-template "My Runner"
                             (list :type "java"
                                   :request "launch"
                                   :args ""
                                   :vmArgs "-ea -Dmyapp.instance.name=myapp_1"
                                   :projectName "myapp"
                                   :mainClass "com.domain.AppRunner"
                                   :env '(("DEV" . "1"))))

Python

Installation

  • install latest version of ptvsd.
    pip install "ptvsd>=4.2"
        
    • Then add the following line in your config:
    (require 'dap-python)
        

    This will add the python related configuration to dap-debug.

Usage

A template named “Python :: Run Configuration” will appear, which will execute the currently visited module. This will fall short whenever you need to specify arguments, environment variables or execute a setuptools based script. In such case, define a template:

(dap-register-debug-template "My App"
  (list :type "python"
        :args "-i"
        :cwd nil
        :env '(("DEBUG" . "1"))
        :target-module (expand-file-name "~/src/myapp/.env/bin/myapp")
        :request "launch"
        :name "My App"))

Ruby

  • Download and extract VSCode Ruby Extension. You can do that either by:
    • Calling dap-ruby-setup, the extension will be downloaded and all your path will be automatically set up.
    • Or download the extension manually. Make sure that dap-ruby-debug-program is: ("node" path-to-main-js) where node is either “node” if nodejs is on the path or path to nodejs and path-to-main-js is full path ./dist/debugger/main.js which is part of the downloaded VScode package.
  • Follow the instructions on installing rdebug-ide from Ruby Debug Installation
  • Put in your emacs configuration.
    (require 'dap-ruby)
        

Dart

Latest version of LSP Dart already has support for dap-mode.

You only need to run dap-dart-setup to setup automatically and then you are good to debug dart.

LLDB

Installation

LLDB is a debugger that supports, among others, C, C++, Objective-C and Swift.

Note: For proper Swift support, you need to compile LLDB from https://github.com/apple/swift-lldb and put the compiled LLDB library/framework in the “extensions” folder.

Elixir

Make sure that you have properly configured Elixir and that you have Elixir LS binaries on the path and put in your emacs configuration.

(require 'dap-elixir)

Then when you do dap-debug-edit-template and select Elixir which will generate runnable debug configuration. For more details on supported settings by the Elixir Debug Server refer to its documentation.

PHP

Simplify setup of vscode extension with dap-php-setup after requiring dap-php.

This is using felixbecker/vscode-php-debug (downloadable from the marketplace) as dap-server between emacs and the xdebug-extension on the http-server side. Make sure it is trans/compiled to javascript properly. Only tested under linux with node.

(require 'dap-php)

Start debugging by selecting “PHP Run Configuration” from the dap-debug menu, issue the debug request in your browser by choosing the running thread (dap-switch-thread) and then dap-step-in.

Native Debug (GDB/LLDB)

Using https://github.com/WebFreak001/code-debug

Configuration

For easier of setting up vscode extension, you only need call dap-gdb-lldb-setup after requiring dap-gdb-lldb.

Or download and extract VSCode extension (make sure that dap-gdb-lldb-path is pointing to the extract location).

(require 'dap-gdb-lldb)

Then do dap-debug or dap-debug-edit-template and selet GBD or LLDB configuration.

Go

Installation

  • For easier of setting up vscode extension, you only need call dap-go-setup after requiring dap-go.
    • Or manually download and extract VSCode Go Extension.. it is actually zip file.
    • check that you now have .emacs.d/.extension/vscode/ms-vscode.go/extension/out/src/debugAdapter/goDebug.js
  • install latest stable nodejs
  • install gopls
  • Install the delve command by following instructions on delve - installation.
  • install lsp-mode
  • Put in your emacs configuration.
    (require 'dap-go)
        
  • set up hydra hook as instructed above

Usage

assume you have your code at ~/src/cool/cmd/app/app.go

  • open your main package file e.g ~/src/cool/cmd/app/app.go
  • or open a test file e.g app_test.go
  • add folder to lsp session where your go.mod is or would be
    • M-x lsp-workspace-folders-add ~/src/cool
  • set break point
  • M-x dap-debug
  • if you are debugging test files use “Go Launch File Configuration”
  • else select e.g “Go Launch Unoptimized Debug Package Configuration”

Trouble shooting

  • put (setq dap-print-io t) and check messages buffer
  • e.g linter can return note at debug session response resulting debug session to fail

Javascript

Firefox

Installation

  • For easier of setting up vscode extension, you only need call dap-firefox-setup after requiring dap-firefox.
  • Make sure that dap-firefox-debug-program is pointing to the proper file.
  • Put in your configuration file:
    (require 'dap-firefox)
        

Usage

dap-debug or dap-debug-edit-template and select the firefox template. For additional documentation on the supported template parameters or about different configuration templates refer to Firefox Debug Adapter.

Chrome

Installation

  • For easier of setting up vscode extension, you only need call dap-chrome-setup after requiring dap-chrome.
  • Make sure that dap-chrome-debug-program is pointing to the proper file.
  • Put in your configuration file:
    (require 'dap-chrome)
        

Usage

dap-debug or dap-debug-edit-template and select the chrome template. For additional documentation on the supported template parameters or about different configuration templates refer to Chrome Debug Adapter.

Microsoft Edge

Installation

  • For easier of setting up vscode extension, you only need call dap-edge-setup after requiring dap-edge.
  • Make sure that dap-edge-debug-program is pointing to the proper file.
  • Put in your configuration file:
    (require 'dap-edge)
        

Usage

dap-debug or dap-debug-edit-template and select the edge template. For additional documentation on the supported template parameters or about different configuration templates refer to Edge Debug Adapter.

Node

Installation

  • For easier of setting up vscode extension, you only need call dap-node-setup after requiring dap-node.
  • Make sure that dap-node-debug-program is pointing to the proper file.
  • Put in your configuration file:
    (require 'dap-node)
        

Usage

dap-debug or dap-debug-edit-template and select the node template. For additional documentation on the supported template parameters or about different configuration templates refer to Nodejs Debugging.

Powershell

(require 'dap-pwsh)

Start debugging by selecting “Powershell: Launch Script” from dap-debug menu.

Extending DAP with new Debug servers

There are two methods that are used for registering remote extensions:

  • dap-register-debug-provider - register a method to call for populating startup parameters. It should either populate :debugPort and :host in case of TCP Debug Adapter Server or :dap-server-path when STD out must be used for Debug Adapter Server communication.
  • dap-register-debug-template register a debug template which will be available when dap-debug is called. The debug template must specify :type key which will be used to determine the provider to be called to populate missing fields.

Example

For full example you may check dap-java.el.

(dap-register-debug-provider
 "programming-language-name"
 (lambda (conf)
   (plist-put conf :debugPort 1234)
   (plist-put conf :host "localhost")
   conf))

(dap-register-debug-template "Example Configuration"
                             (list :type "java"
                                   :request "launch"
                                   :args ""
                                   :name "Run Configuration"))

Links

Acknowledgments

About

Emacs ❤️ Debug Adapter Protocol

Resources

License

Code of conduct

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Emacs Lisp 87.3%
  • Gherkin 12.5%
  • Java 0.2%