Getting started with lldb-dap

lldb-dap brings the power of lldb to any editor or IDE that supports the Debug Adapter Protocol (DAP).

Responsibilities of LLDB, lldb-dap and IDE Integrations

Under the hood, the UI-based debugging experience is powered by three separate components:

  • LLDB provides general, IDE-independent debugging features, such as: loading binaries / core dumps, interpreting debug info, setting breakpoints, pretty-printing variables, etc. The lldb binary exposes this functionality via a command line interface.
  • lldb-dap exposes LLDB's functionality via the “Debug Adapter Protocol”, i.e. a protocol through which various IDEs (Visual Studio Code, Emacs, vim, neovim, ...) can interact with a wide range of debuggers (lldb-dap and many others).
  • An IDE specific extension is used to hook lldb-dap and the IDEs DAP implementations together for launching a binary.

Since lldb-dap builds on top of LLDB, all of LLDB's extensibility mechanisms such as Variable Pretty-Printing, Frame recognizers and Python Scripting are available also in lldb-dap.

Links to IDE Extensions

Procuring the lldb-dap binary

There are multiple ways to obtain this binary:

  • Use the binary provided by your toolchain (for example xcrun -f lldb-dap on macOS) or contact your toolchain vendor to include it.
  • Download one of the release packages from the LLVM release page. The LLVM-{version}-{operating_system}.tar.xz packages contain a prebuilt lldb-dap binary or check your systems prefered package manager.
  • Build it from source (see LLDB's build instructions).

In some cases, a language specific build of lldb / lldb-dap may also be available as part of the languages toolchain. For example the swift language toolchain includes additional language integrations in lldb and the toolchain builds provider both the lldb driver binary and lldb-dap binary.

Launching a program

To launch an executable for debugging, first define a launch configuration tells lldb-dap how to launch the binary.

A simple launch configuration may look like

{
  "type": "lldb-dap",
  "request": "launch",
  "name": "Debug a.out",
  "program": "a.out"
}

See the Configuration Settings Reference for more information.

Supported Features

lldb-dap supports the following capabilities:

CapabilitySupportedDescription
supportsConfigurationDoneRequestYThe debug adapter supports the configurationDone request.
supportsFunctionBreakpointsYThe debug adapter supports function breakpoints.
supportsConditionalBreakpointsYThe debug adapter supports conditional breakpoints.
supportsHitConditionalBreakpointsYThe debug adapter supports breakpoints that break execution after a specified number of hits.
supportsEvaluateForHoversYThe debug adapter supports a (side effect free) evaluate request for data hovers.
exceptionBreakpointFiltersYAvailable exception filter options for the setExceptionBreakpoints request.
supportsStepBackNThe debug adapter supports stepping back via the stepBack and reverseContinue requests.
supportsSetVariableNThe debug adapter supports setting a variable to a value.
supportsRestartFrameYThe debug adapter supports restarting a frame.
supportsGotoTargetsRequestNThe debug adapter supports the gotoTargets request.
supportsStepInTargetsRequestYThe debug adapter supports the stepInTargets request.
supportsCompletionsRequestYThe debug adapter supports the completions request.
completionTriggerCharacters['.', '\s', '\t']The set of characters that should trigger completion in a REPL. If not specified, the UI should assume the . character.
supportsModulesRequestYThe debug adapter supports the modules request.
additionalModuleColumnsNThe set of additional module information exposed by the debug adapter.
supportedChecksumAlgorithmsNChecksum algorithms supported by the debug adapter.
supportsRestartRequestY (for launch requests)The debug adapter supports the restart request. In this case a client should not implement restart by terminating and relaunching the adapter but by calling the restart request.
supportsExceptionOptionsNThe debug adapter supports exceptionOptions on the setExceptionBreakpoints request.
supportsValueFormattingOptionsYThe debug adapter supports a format attribute on the stackTrace, variables, and evaluate requests.
supportsExceptionInfoRequestYThe debug adapter supports the exceptionInfo request.
supportTerminateDebuggeeYThe debug adapter supports the terminateDebuggee attribute on the disconnect request.
supportSuspendDebuggeeNThe debug adapter supports the suspendDebuggee attribute on the disconnect request.
supportsDelayedStackTraceLoadingYThe debug adapter supports the delayed loading of parts of the stack, which requires that both the startFrame and levels arguments and the totalFrames result of the stackTrace request are supported.
supportsLoadedSourcesRequestNThe debug adapter supports the loadedSources request.
supportsLogPointsYThe debug adapter supports log points by interpreting the logMessage attribute of the SourceBreakpoint.
supportsTerminateThreadsRequestNThe debug adapter supports the terminateThreads request.
supportsSetExpressionYThe debug adapter supports the setExpression request.
supportsTerminateRequestNThe debug adapter supports the terminate request.
supportsDataBreakpointsYThe debug adapter supports data breakpoints.
supportsReadMemoryRequestYThe debug adapter supports the readMemory request.
supportsWriteMemoryRequestYThe debug adapter supports the writeMemory request.
supportsDisassembleRequestYThe debug adapter supports the disassemble request.
supportsCancelRequestYThe debug adapter supports the cancel request.
supportsBreakpointLocationsRequestYThe debug adapter supports the breakpointLocations request.
supportsClipboardContextNThe debug adapter supports the clipboard context value in the evaluate request.
supportsSteppingGranularityYThe debug adapter supports stepping granularities (argument granularity) for the stepping requests.
supportsInstructionBreakpointsYThe debug adapter supports adding breakpoints based on instruction references.
supportsExceptionFilterOptionsNThe debug adapter supports filterOptions as an argument on the setExceptionBreakpoints request.
supportsSingleThreadExecutionRequestsNThe debug adapter supports the singleThread property on the execution requests (continue, next, stepIn, stepOut, reverseContinue, stepBack).
supportsDataBreakpointBytesYThe debug adapter supports the asAddress and bytes fields in the dataBreakpointInfo request.
breakpointModes[]Modes of breakpoints supported by the debug adapter, such as ‘hardware’ or ‘software’. If present, the client may allow the user to select a mode and include it in its setBreakpoints request. Clients may present the first applicable mode in this array as the ‘default’ mode in gestures that set breakpoints.
supportsANSIStylingYThe debug adapter supports ANSI escape sequences in styling of OutputEvent.output and Variable.value fields.

For more information, see Debug Adapter Protocol.

Debug Console

The Debug Console allows printing variables / expressions and executing lldb commands. By default, lldb-dap tries to auto-detect whether a provided command is a variable name / expression whose values will be printed to the Debug Console or a LLDB command. To side-step this auto-detection and execute a LLDB command, prefix it with the commandEscapePrefix.

The auto-detection mode can be adjusted using the lldb-dap repl-mode command in the Debug Console or by adjusting the --repl-mode [mode] argument to lldb-dap. The supported modes are variable, command and auto.

Configuration Settings Reference

In order for lldb-dap to know how to start a debug session a launch or attach configuration may be specified. Different IDEs may have different mechanisms in place for configuring the launch configuration.

For Visual Studio Code, see Visual Studio Code's Debugging User Documentation.

Common configurations

For both launch and attach configurations, lldb-dap accepts the following lldb-dap specific key/value pairs:

ParameterTypeReq
namestringYA configuration name that will be displayed in the IDE.
typestringYMust be “lldb-dap”.
requeststringYMust be “launch” or “attach”.
programstringPath to the executable to launch.
sourcePathstringSpecify a source path to remap "./" to allow full paths to be used when setting breakpoints in binaries that have relative source paths.
sourceMap[string[2]]Specify an array of path re-mappings. Each element in the array must be a two element array containing a source and destination pathname. Overrides sourcePath.
debuggerRootstringSpecify a working directory to use when launching lldb-dap. If the debug information in your executable contains relative paths, this option can be used so that lldb-dap can find source files and object files that have relative paths.
commandEscapePrefixstringThe escape prefix to use for executing regular LLDB commands in the Debug Console, instead of printing variables. Defaults to a backtick. If it's an empty string, then all expression in the Debug Console are treated as regular LLDB commands.
customFrameFormatstringIf non-empty, stack frames will have descriptions generated based on the provided format. See https://lldb.llvm.org/use/formatting.html for an explanation on format strings for frames. If the format string contains errors, an error message will be displayed on the Debug Console and the default frame names will be used. This might come with a performance cost because debug information might need to be processed to generate the description.
customThreadFormatstringSame as customFrameFormat, but for threads instead of stack frames.
displayExtendedBacktraceboolEnable language specific extended backtraces.
enableAutoVariableSummariesboolEnable auto generated summaries for variables when no summaries exist for a given type. This feature can cause performance delays in large projects when viewing variables.
enableSyntheticChildDebuggingboolIf a variable is displayed using a synthetic children, also display the actual contents of the variable at the end under a [raw] entry. This is useful when creating synthetic child plug-ins as it lets you see the actual contents of the variable.
initCommands[string]LLDB commands executed upon debugger startup prior to creating the LLDB target.
preRunCommands[string]LLDB commands executed just before launching/attaching, after the LLDB target has been created.
stopCommands[string]LLDB commands executed just after each stop.
exitCommands[string]LLDB commands executed when the program exits.
terminateCommands[string]LLDB commands executed when the debugging session ends.

All commands and command outputs will be sent to the debugger console when they are executed. Commands can be prefixed with ? or ! to modify their behavior:

  • Commands prefixed with ? are quiet on success, i.e. nothing is written to stdout if the command succeeds.
  • Prefixing a command with ! enables error checking: If a command prefixed with ! fails, subsequent commands will not be run. This is useful if one of the commands depends on another, as it will stop the chain of commands.

Launch configurations

NOTE: Either program or launchCommands must be specified.

For JSON configurations of "type": "launch", the JSON configuration can additionally contain the following key/value pairs:

ParameterTypeReq
programstringPath to the executable to launch.
args[string]An array of command line argument strings to be passed to the program being launched.
cwdstringThe program working directory.
envdictionary or [string]Environment variables to set when launching the program. The string format of each environment variable string is “VAR=VALUE” for environment variables with values or just “VAR” for environment variables with no values.
stopOnEntrybooleanWhether to stop program immediately after launching.
runInTerminal (deprecated)booleanLaunch the program inside an integrated terminal in the IDE. Useful for debugging interactive command line programs.
consolestringSpecify where to launch the program: internal console (internalConsole), integrated terminal (integratedTerminal) or external terminal (externalTerminal). Supported from lldb-dap 21.0 version.
stdio[string]The stdio property specifies the redirection targets for the debuggee's stdio streams. A null value redirects a stream to the default debug terminal. String can be a path to file, named pipe or TTY device. If less than three values are provided, the list will be padded with the last value. Specifying more than three values will create additional file descriptors (4, 5, etc.). Supported from lldb-dap 22.0 version.
launchCommands[string]LLDB commands executed to launch the program.

Attach configurations

NOTE: Either pid, program, coreFile, attachCommands orgdb-remote-port must be specified.

For JSON configurations of "type": "attach", the JSON configuration can contain the following lldb-dap specific key/value pairs:

ParameterTypeReq
programstringPath to the executable to attach to. This value is optional but can help to resolve breakpoints prior the attaching to the program.
pidnumberThe process id of the process you wish to attach to. If pid is omitted, the debugger will attempt to attach to the program by finding a process whose file name matches the file name from program. Setting this value to ${command:pickMyProcess} will allow interactive process selection in the Visual Studio Code.
waitForbooleanWait for the process to launch.
attachCommands[string]LLDB commands that will be executed after preRunCommands which take place of the code that normally does the attach. The commands can create a new target and attach or launch it however desired. This allows custom launch and attach configurations. Core files can use target create --core /path/to/core to attach to core files.
gdb-remote-portintTCP/IP port to attach to a remote system. Specifying both pid and port is an error.
gdb-remote-hoststringThe hostname to connect to a remote system. The default hostname being used localhost.