# Debugging

The Go extension allows you to launch or attach to Go programs for debugging.
You can inspect variables and stacks, set breakpoints, and do other debugging
activities using
[VS Code’s Debugging UI](https://code.visualstudio.com/docs/editor/debugging).

These debugging features are possible by using
[Delve](https://github.com/go-delve/delve), the Go debugger.

Previously, the Go extension communicated with Delve through a custom debug
adaptor program (`legacy` mode). Since
[`Delve`'s native debug adapter implementation](https://github.com/go-delve/delve/tree/master/service/dap)
is available, the Go extension is transitioning to deprecate the legacy debug
adapter in favor of direct communication with Delve via
[DAP](https://microsoft.github.io/debug-adapter-protocol/overview).


 📣 **We are happy to announce that the new _`dlv-dap`_ mode of Delve
 integration is enabled for _local_ _debugging_ by default. For
 [_remote_ _debugging_](#remote-debugging) it is the default in
 [pre-release versions](https://github.com/golang/vscode-go/blob/master/README.md#pre-release-version) and is available with stable builds on demand with
 `"debugAdapter": "dlv-dap"` attribute in `launch.json` or `settings.json`!**

Many features and settings described in this document may be available only with
the new `dlv-dap` mode. For troubleshooting and configuring the legacy debug
adapter, see
[the legacy debug adapter documentation](https://github.com/golang/vscode-go/tree/master/docs/debugging-legacy.md).

## Get started

Open a file to debug (either `package main` source file or the test file) in the
editor, and select the `Run and Debug` button from
[the Run view](https://code.visualstudio.com/docs/editor/debugging#_run-view).
Alternatively, you can start debugging using `Start Debugging (F5)` command from
[the Run menu](https://code.visualstudio.com/docs/editor/debugging#_run-menu) or
from
[the Command Palette](https://code.visualstudio.com/docs/getstarted/userinterface#_command-palette)
(Linux/Windows: Ctrl+Shift+P, Mac: ⇧+⌘+P).

If you already have launch configurations for the project
(`.vscode/launch.json`), the Run view will display the configuration list to
choose from.

When no configuration is configured yet (no `.vscode/launch.json` file), the
extension will choose a default configuration based on the file open in the
editor.

❗ When you start debugging for
the first time or if the `dlv` executable on your system is too old to support
DAP, the Go extension may ask to install or update Delve. Follow the
instructions to install it, and then start the debugging session again.

<p align="center"> <img src="images/dlvdap-install.gif" alt="Delve Install"
width="75%"><!--TODO: update image--> <br/>  </p>

To learn more about debugging in Go, watch
[Go: Writing and debugging fast, reliable, and efficient software](https://www.youtube.com/watch?v=6r08zGi38Tk&list=PLj6YeMhvp2S40Q-TEPEKOeypLvTVd5uME&index=1).

Review the [Features](#features) section for an overview of
the Go Extension's debug UI and available features.

### Stay up to date

[Delve’s native DAP implementation](https://github.com/go-delve/delve/tree/master/service/dap)
is under active development. Take advantage of the most recent features and bug
fixes by installing the latest version of `dlv` using the
**`Go:Install/Update`** Tools command from the Command Palette (Linux/Windows:
`Ctrl`+`Shift`+`P`, Mac: `Command`+`Shift`+`P`). The command will show `dlv` in
the tool list.

Once `dlv` is installed on your system, the extension will prompt you for update
whenever installing a newer version is necessary. You can set the
`go.toolsManagement.autoUpdate` setting so the extension can update `dlv`
automatically for you.

If you need to install `dlv` manually outside of VS Code, follow the instruction
in [Manually installing `dlv`](debugging.md#manually-installing-dlv). An example
of a situation where manual installation might be needed is if you are building
a dev container with the necessary tools preinstalled, or installing `dlv` built
from the tree head.

### Switch to legacy debug adapter

Note: The extension still uses the legacy debug adapter for remote debugging.

If you need to use the legacy debug adapter for local debugging (`legacy` mode)
by default, add the following in your VSCode settings.

```json
    "go.delveConfig": {
        "debugAdapter": "legacy",
    }
```

When `mode` is set to `remote` you must explicitly set `debugAdapter` to
`dlv-dap` to override the legacy adapter default.

If you want to switch to `legacy` for only a subset of your launch
configurations, you can use
[the `debugAdapter` attribute](#launchjson-attributes) to switch between
`"dlv-dap"` and `"legacy"` mode.

If you chose to switch to legacy because of bugs or limitations in the new debug
adapter, [open an issue](https://github.com/golang/vscode-go/issues/new)
to help us improve.

## Features

For general debugging features such as inspecting variables, setting
breakpoints, and other activities that aren't language-dependent, review
[VS Code debugging](https://code.visualstudio.com/docs/editor/debugging).

### Configure

When you need more than the default debugging setup, you can create a launch
configuration file for the project.

To create a configuration file:

1. In the
   [the Run view](https://code.visualstudio.com/docs/editor/debugging#_run-view),
   click "create a launch.json file"
1. Choose **Go: Launch Package** from the debug configuration drop-down menu. VS
   Code will create a `launch.json` file in a .vscode folder in your workspace
   (project root folder) or in your
   [user settings](https://code.visualstudio.com/docs/editor/debugging#_global-launch-configuration)
   or
   [workspace settings](https://code.visualstudio.com/docs/editor/multi-root-workspaces#_workspace-launch-configurations).

<p align="center">
<img src="images/create-launch-json.gif" alt="Create a launch.json configuration file." width="75%">
</p>

If you already have a `launch.json` for your project, you can open it using the
Command Palette **Open launch.json** command.

To add a new configuration to an existing `launch.json` file:

1. Open your `launch.json` file using the Command Palette **Open launch.json**
   command.
1. Click the **Add Configuration** button to invoke the snippet IntelliSense.

There are many configuration attributes (see
[the Launch.json attributes](#launchjson-attributes) section). IntelliSense in
VS Code’s `launch.json` editor will help you navigate available options and
documentation.

### Launch

To launch and debug your project, select **Run** > **Start Debugging (F5)**.

The launch feature uses a `launch` request type configuration in your
`launch.json` file. Its `program` attribute needs to be the absolute path to
either the Go file, or folder containing the main package or test file. In this
mode, the Go extension will start the debug session by building and launching
the program. The launched program will be terminated when the debug session
ends.

* Supported modes
  * `debug`: build and debug a main package
  * `test`: build and debug a test
  * `exec`: debug a precompiled binary
    * The binary must be built with `go build -gcflags=all="-N -l"` to disable
      inlining and optimizations that can interfere with debugging.
  * `auto`: automatically choose between `debug` and `test` depending on the
    open file

⚠️ For ["Remote Debugging"](#remote-debugging), add the `port` attribute to the
launch configuration. VS Code will connect to the external user-specified
`dlv dap` server at `host:port` and launch the target there.

For remote debugging, the `program` attribute must point to the absolute path to
the package or binary to debug in the remote host’s file system even when
`substitutePath` is specified.

### Attach

You can use this configuration to attach to a running process or a running debug
session.

* Supported modes
  * `local`: attaches to a local process.
    * The binary must be built with `go build -gcflags=all="-N -l"` to disable
      inlining and optimizations that can interfere with debugging.
  * `remote`: attaches to an in-progress debug session run by an external
    server.

You can debug an already running program using the `local` mode type
configuration. The Go extension will start `dlv dap` and configure it to attach
to the specified process. Users can select the process to debug with one of the
following options:

* Specifying the numeric process id (PID) with the `processId` attribute.
* Specifying the target program name in the `processId` attribute. If there are
  multiple processes matching the specified program name, the extension will
  show the list of matching processes at the start of the debug session.
* Specifying `0` in the `processId` attribute and selecting the process from the
  drop-down menu at the start of the debug session.

<p align="center">
<img src="images/attach.gif" alt="Attach to a running process" width="75%">
</p>

NOTE: For remote debugging, add the `port` attribute to
the launch configuration. VS Code will connect to the external user-specified
`dlv dap` server at `host:port` and attach to the target there.See
["remote debugging"](#remote-debugging) for more details).

You can connect to an already running remote debug session using the `remote`
mode. Specify optional `host` and required `port` for the external
`dlv --headless` server that already took program or process id details as
command-line arguments. See ["Remote Debugging"](#remote-debugging) for more
details).

When you end an attach debug session, the debug UI allows you to choose to:

* [DEFAULT] Disconnect: disconnect the client and:
  * `local`: leave the target process running (dlv terminates).
  * `remote`: let dlv decide if it can continue running (`--accept-multiclient`
    mode only); if so, the target will stay in halted or running state it was in
    at disconnect.
    * `dlv debug/test/exec`: terminate the target process if dlv terminates.
    * `dlv attach`: leave the target process running even if dlv terminates.
* Stop: stop the attached server and the target process.

<p align="center">
<img src="images/attach-terminate.gif" alt="Terminate Debugging started with Attach" style="width: 30%">
</p>

<!-- TODO:[SupportSuspendDebuggee](https://code.visualstudio.com/updates/v1_56#_disconnect-debugger-and-keep-debuggee-suspended) -->

### Debug actions

Once a debug session starts, the Debug toolbar will appear on the top of the
editor.

<p align="center">
<img src="images/debug-toolbar.png" alt="Debug Tool Bar" width="30%">
</p>

The available commands are:

* Continue / Pause F5
* Step Over (aka `next` in Delve) F10
* Step Into (aka `step` in Delve) F11
* Step Out (aka `stepout` in Delve) Shift+F11 or ⇧F11
* Restart (currently this is "Stop + Start") Ctrl+Shift+F5 or ⇧⌘F5
* Stop (terminate the debugee. Available in Launch request) Shift+F5 or ⇧F5
* Disconnect (detach from the debugee. Available only in Attach request)
  Shift+F5 or ⇧F5
* Terminate (terminate the debugee. Available only in Attach request)
  Alt+Shift+F5 or ⌥⇧F5

### Breakpoints

See
[VS Code’s Debug Documentation on Breakpoints](https://code.visualstudio.com/docs/editor/debugging#_breakpoints)
to get familiar with VS Code’s UI. The Go debugger supports multiple ways to
configure breakpoints.

* **Breakpoints**: you can set breakpoints by clicking on the editor margin or
  using F9 on the current line. If the breakpoints can’t be set by Delve, VS
  Code will show the failure reason and grey out the dot.

<p align="center">
<img src="images/invalid-breakpoint.png" alt="Invalid breakpoint" width="75%">
</p>

* **Conditional breakpoints**: you can specify breakpoint conditions (similar to
  Delve’s
  [`condition` command](https://github.com/go-delve/delve/tree/master/Documentation/cli#condition)).
  * Expression condition: takes a boolean expression.
  * Hit count: supports comparison operators (`>`, `>=`, `<`, `<=`, `==`, `!=`)
    with an integer value. `% n` form means we should stop at the breakpoint
    when the hitcount is a multiple of `n`.

<p align="center">
<img src="images/conditional-breakpoint.gif" alt="Conditional Breakpoint" width="50%">
</p>

* **Function Breakpoints**: breakpoints can be set based on function names.
  Press the + button in the BREAKPOINTS section header and enter the location in
  the form of `<function>[:<line>]`. This sets the breakpoint in the `line`
  inside the `function`. The full syntax for `function` is
  `<package>.(*<receiver type>).<function_name>` as specified in
  [Delve’s location spec](https://github.com/go-delve/delve/blob/master/Documentation/cli/locspec.md#location-specifiers).
  Function breakpoints are shown with a red triangle in the BREAKPOINTS section.

<p align="center">
<img src="images/function-breakpoint.gif" alt="Function breakpoint" width="75%">
</p>

* **Logpoints**: a
  [logpoint](https://code.visualstudio.com/docs/editor/debugging#_logpoints) is
  a variant of breakpoint that does not 'break', but instead logs a message to
  DEBUG CONSOLE and continues execution. Expressions within `{}` are
  interpolated. For the list of acceptable expressions and syntax, see
  [Delve's documentation](https://github.com/go-delve/delve/blob/master/Documentation/cli/expr.md#expressions).

### Data inspection

You can inspect variables in the VARIABLES section of the Run view or by
hovering over their source in the editor. Variable values and expression
evaluation are relative to the selected stack frame in the CALL section.

By default, the VARIABLES section hides global variables, and shows only local
variables and function arguments. However, you can still inspect global
variables from the DEBUG CONSOLE panel. If you prefer to have the VARIABLES
section show global variables, set the `showGlobalVariables` attribute in the
`launch.json` configuration, or set it in the `go.delveConfig` setting.

When you select a variable and right click from the VARIABLES section, the
context menu will present shortcuts to features such as:

* `Set Value`: you can set/modify simple string, numeric, pointer values. Using
  composite literals, or memory allocation is not supported.
* `Copy Value`: this copies the value in clipboard.
* `Copy as Expression`: this is useful when you need to query from the REPL in
  the DEBUG CONSOLE panel.
* `Add to Watch`: this will automatically add the expression to the WATCH
  section.

Shadowed variables will be marked with `()`.

<p align="center">
<img src="images/shadowed-variables.png" alt="Shadowed Variables" style="width: 50%">
</p>

⚠️ Delve debugger imposes variable loading limits to prevent loading too many
variables at once and negatively impacting debugging latency. The `dlv-dap` mode
uses a different approach. It takes advantage of the interactive UI features to
provide on-demand loading of individual variables, paging of arrays, slices and
maps and increased string limits depending on the context. We continue to
explore additional interactive features to balance performance and usability of
variable loading and look forward to your feedback.

You can inspect variables and evaluate expressions from the DEBUG CONSOLE panel
too. Acceptable expressions are either

* A valid
  [Delve expression](https://github.com/go-delve/delve/blob/master/Documentation/cli/expr.md),
  or
* `call <function_call_expression>` to call functions.

<p align="center">
<img src="images/debug-console.png" alt="Debug Console" width="50%">
</p>

Variables and expressions accepted in DEBUG CONSOLE can be also registered in
the Run view’s WATCH section, so they can be evaluated automatically as you
debug. The "Add to Watch" feature from the VARIABLES section is convenient when
you want to register interesting variables.

⚠️ Function call feature is highly EXPERIMENTAL due to the limitation in Go
runtime. Registering function calls in the WATCH section can often be
problematic. Pause, stop, and disconnect will not work while a function call is
running.

Hover over variables in editors during debugging shows the value of the
variable. For this feature, VS Code extracts the variable expression and makes a
request to the debugger to evaluate the expression. Delve evaluates the
expression relative to the highlighted stack frame chosen in the CALL STACK. By
default, that is the current top-most frame.

<p align="center"><img src="images/variable-hover.png" alt="Hover over Variable in Source Code" width="50%">
 </p>

⚠️ Limitation

* VS Code heuristically determines the variable expression without full
  understanding of the scope & the currently selected frame. Delve tries to
  evaluate the provided expression in the selected frame. As a result, hover
  over variables outside the selected frame’s function may present incorrect
  information.

### Call stack

You can inspect all goroutines and their stacks in the CALL STACK section. The
CALL STACK section UI allows switching between goroutines or selecting a
different stack frame. As a different stack frame or different goroutine is
selected, the scope shown in the VARIABLE section will be updated for the newly
selected stack frame, and the expressions in the WATCH section will be
automatically reevaluated relative to the newly selected stack frame.

<p align="center"><img src="images/callstack-section-annotated.gif" alt="Call Stack Section Overview" width="75%"> </p>

1. Goroutine stacks are annotated with their internal goroutine IDs.
2. The current goroutine is marked with `*`. If multiple goroutines stop (e.g.
   hit breakpoints) concurrently, Delve will pick one randomly. There also might
   not be a current goroutine (e.g. deadlock, pause or internal breakpoint hit
   by a system thread not running a goroutine).
3. If you click a goroutine call stack from the CALL STACK section, the
   goroutine is _selected_.
4. You can select a frame of the selected goroutine. The VARIABLE and WATCH
   sections will be updated accordingly and the cursor in the editor will be
   moved to the corresponding location in the source code.
5. Runtime stack frames are deemphasized (greyed out or collapsed).
6. Thread IDs are shown for scheduled goroutines.
7. Stop reason. It’s possible that there are multiple reasons goroutines were
   stopped, but currently only one reason is presented.
8. File name and line number of the frame.
9. You can trigger a debug action with the selected goroutine. Note: Resuming or
   stopping only a single goroutine (Go Issue
   [25578](https://github.com/golang/go/issues/25578),
   [31132](https://github.com/golang/go/issues/31132)) is currently not
   supported, so the action will cause all the goroutines to get activated or
   paused.
10. Function name of the frame.

When the program stops due to exception, panic, or bad access error, the CALL
STACK shows the stop reason and the editor highlights the source location with
more details.

<p align="center"><img src="images/panicinfo.png" alt="Panic" width="75%"></p>

## `dlv` command from DEBUG CONSOLE

DEBUG CONSOLE accepts commands that allow users to dynamically inspect/change
debug configuration, or inspect the list of source code compiled in the debugged
binary. Use `dlv help` and `dlv config -list` from the DEBUG CONSOLE panel to
see the list of supported commands and dynamically adjustable settings.

## Configuration

### Launch.json attributes

There are many attributes that you can adjust in the launch and attach debug
configuration. The following general attributes are mandatory for all launch
configurations.

* `name`: the name of your configuration as it appears in the drop-down in the
  Run view.
* `type`: the debugging type VS Code uses to decide which debugging extension
  should be used. Always leave this set to `"go"`.
* `request`: `launch` or `attach`.

Here is the list of attributes specific to Go debugging.

<!-- DO NOT EDIT: Auto-generated by go run tools/generate -->
<!-- SETTINGS BEGIN -->
| Property | Launch | Attach |
| --- | --- | --- |
| `args` | Command line arguments passed to the debugged program.<br/>(Default: `[]`)<br/> | <center>_n/a_</center> |
| `asRoot` | (Experimental) Debug with elevated permissions (on Unix). It requires `integrated` or `external` console modes and is ignored in remote debugging.<br/>(Default: `false`)<br/> | (Experimental) Debug with elevated permissions (on Unix). This requires `integrated` or `external` console modes and is ignored in remote debugging.<br/>(Default: `false`)<br/> |
| `backend` | Backend used by delve. Maps to `dlv`'s `--backend` flag.<br/><p>Allowed Values: `"default"`, `"native"`, `"lldb"`, `"rr"`<br/> | <center>_same as Launch_</center>|
| `buildFlags` | Build flags, to be passed to the Go compiler. Maps to dlv's `--build-flags` flag.<br/>(Default: `[]`)<br/> | <center>_n/a_</center> |
| `console` | (Experimental) Where to launch the debugger and the debug target: internal console, integrated terminal, or external terminal. It is ignored in remote debugging.<br/><p>Allowed Values: `"internalConsole"`, `"integratedTerminal"`, `"externalTerminal"`<br/>(Default: `internalConsole`)<br/> | (Experimental) Where to launch the debugger: internal console, integrated terminal, or external terminal. This does not affect tty of the running program. It is ignored in remote debugging.<br/><p>Allowed Values: `"internalConsole"`, `"integratedTerminal"`, `"externalTerminal"`<br/>(Default: `internalConsole`)<br/> |
| `coreFilePath` | Path to the core dump file to open. For use on 'core' mode only<br/>(Default: `""`)<br/> | <center>_n/a_</center> |
| `cwd` | Workspace relative or absolute path to the working directory of the program being debugged if a non-empty value is specified. The `program` folder is used as the working directory if `cwd` is omitted or empty.<br/>(Default: `""`)<br/> | Workspace relative or absolute path to the working directory of the program being debugged. Default is the current workspace.<br/>(Default: `"${workspaceFolder}"`)<br/> |
| `debugAdapter` | Select which debug adapter to use with this launch configuration.<br/><p>Allowed Values: `"legacy"`, `"dlv-dap"`<br/>(Default: `dlv-dap`)<br/> | <center>_same as Launch_</center>|
| `dlvFlags` | Extra flags for `dlv`. See `dlv help` for the full list of supported. Flags such as `--log-output`, `--log`, `--log-dest`, `--api-version`, `--output`, `--backend` already have corresponding properties in the debug configuration, and flags such as `--listen` and `--headless` are used internally. If they are specified in `dlvFlags`, they may be ignored or cause an error.<br/> | <center>_same as Launch_</center>|
| `env` | Environment variables passed to the launched debuggee program. Format as string key:value pairs. Merged with `envFile` and `go.toolsEnvVars` with precedence `env` > `envFile` > `go.toolsEnvVars`.<br/> | <center>_n/a_</center> |
| `envFile` | Absolute path to a file containing environment variable definitions, formatted as string key=value pairs. Multiple files can be specified by provided an array of absolute paths. Merged with `env` and `go.toolsEnvVars` with precedence `env` > `envFile` > `go.toolsEnvVars`. <br/> | <center>_n/a_</center> |
| `followExec` | (Experimental) Enables or disables follow exec mode.<br/>(Default: `false`)<br/> | <center>_n/a_</center> |
| `followExecRegex` | (Experimental) Regular expression. Only child processes with a command line that matches this regular expression will be followed during 'target follow-exec'.<br/>(Default: `""`)<br/> | <center>_n/a_</center> |
| `goroutineFilters` | Configures which system goroutines should be shown in the call stack. See https://github.com/go-delve/delve/blob/master/Documentation/cli/README.md#goroutines<br/>(Default: `""`)<br/> | <center>_same as Launch_</center>|
| `hideSystemGoroutines` | Boolean value to indicate whether system goroutines should be hidden from call stack view.<br/>(Default: `false`)<br/> | <center>_same as Launch_</center>|
| `host` | When applied to remote-attach configurations, will look for "dlv ... --headless --listen=<host>:<port>" server started externally. In dlv-dap mode this will apply to all other configurations as well. The extension will try to connect to an external server started with "dlv dap --listen=<host>:<port>" to ask it to launch/attach to the target process.<br/>(Default: `"127.0.0.1"`)<br/> | When applied to remote-attach configurations, will look for "dlv ... --headless --listen=<host>:<port>" server started externally. In dlv-dap mode, this will apply to all other configurations as well. The extension will try to connect to an external server started with "dlv dap --listen=<host>:<port>" to ask it to launch/attach to the target process.<br/>(Default: `"127.0.0.1"`)<br/> |
| `logDest` | dlv's `--log-dest` flag. See `dlv log` for details. Number argument is not allowed. Supported only in `dlv-dap` mode, and on Linux and Mac OS.<br/> | dlv's `--log-dest` flag. See `dlv log` for details. Number argument is not allowed. Supported only in `dlv-dap` mode and on Linux and Mac OS.<br/> |
| `logOutput` | Comma separated list of components that should produce debug output. Maps to dlv's `--log-output` flag. Check `dlv log` for details.<br/><p>Allowed Values: `"debugger"`, `"gdbwire"`, `"lldbout"`, `"debuglineerr"`, `"rpc"`, `"dap"`<br/>(Default: `"debugger"`)<br/> | <center>_same as Launch_</center>|
| `mode` | One of `auto`, `debug`, `test`, `exec`, `replay`, `core`. In `auto` mode, the extension will choose either `debug` or `test` depending on active editor window.<br/><p>Allowed Values: `"auto"`, `"debug"`, `"test"`, `"exec"`, `"replay"`, `"core"`<br/>(Default: `auto`)<br/> | Indicates local or remote debugging. Local is similar to the `dlv attach` command, remote - to `dlv connect`<br/><p>Allowed Values: `"local"`, `"remote"`<br/>(Default: `local`)<br/> |
| `output` | Output path for the binary of the debugee.<br/>(Default: `"debug"`)<br/> | <center>_n/a_</center> |
| `port` | When applied to remote-attach configurations, will look for "dlv ... --headless --listen=<host>:<port>" server started externally. In dlv-dap mode this will apply to all other configurations as well. The extension will try to connect to an external server started with "dlv dap --listen=<host>:<port>" to ask it to launch/attach to the target process.<br/>(Default: `2345`)<br/> | When applied to remote-attach configurations, will look for "dlv ... --headless --listen=<host>:<port>" server started externally. In dlv-dap mode, this will apply to all other configurations as well. The extension will try to connect to an external server started with "dlv dap --listen=<host>:<port>" to ask it to launch/attach to the target process.<br/>(Default: `2345`)<br/> |
| `processId` | <center>_n/a_</center> | <br/><p><b>Option 1:</b> Use process picker to select a process to attach, or Process ID as integer.<br/><p>Allowed Values: `"${command:pickProcess}"`, `"${command:pickGoProcess}"`<br/><br/><p><b>Option 2:</b> Attach to a process by name. If more than one process matches the name, use the process picker to select a process.<br/><br/><p><b>Option 3:</b> The numeric ID of the process to be debugged. If 0, use the process picker to select a process.<br/><br/>(Default: `0`)<br/> |
| `program` | Path to the program folder (or any go file within that folder) when in `debug` or `test` mode, and to the pre-built binary file to debug in `exec` mode. If it is not an absolute path, the extension interprets it as a workspace relative path.<br/>(Default: `"${workspaceFolder}"`)<br/> | <center>_n/a_</center> |
| `remotePath` | <center>_n/a_</center> | (Deprecated) *Use `substitutePath` instead.*<br/>The path to the source code on the remote machine, when the remote path is different from the local machine. If specified, becomes the first entry in substitutePath. Not supported with `dlv-dap`.<br/>(Default: `""`)<br/> |
| `showGlobalVariables` | Boolean value to indicate whether global package variables should be shown in the variables pane or not.<br/>(Default: `false`)<br/> | <center>_same as Launch_</center>|
| `showLog` | Show log output from the delve debugger. Maps to dlv's `--log` flag.<br/>(Default: `false`)<br/> | <center>_same as Launch_</center>|
| `showPprofLabels` | Configures which pprof lables to show as the goroutine name in the threads view<br/> | <center>_same as Launch_</center>|
| `showRegisters` | Boolean value to indicate whether register variables should be shown in the variables pane or not.<br/>(Default: `false`)<br/> | <center>_same as Launch_</center>|
| `stackTraceDepth` | Maximum depth of stack trace collected from Delve.<br/>(Default: `50`)<br/> | <center>_same as Launch_</center>|
| `stderrTo` | Writes the program's standard error to a file<br/>(Default: `""`)<br/> | <center>_n/a_</center> |
| `stdinFrom` | Reads the program's standard input from a file<br/>(Default: `""`)<br/> | <center>_n/a_</center> |
| `stdoutTo` | Writes the program's standard output to a file<br/>(Default: `""`)<br/> | <center>_n/a_</center> |
| `stopOnEntry` | Automatically stop program after launch.<br/>(Default: `false`)<br/> | Automatically stop program after attach.<br/>(Default: `false`)<br/> |
| `substitutePath` | An array of mappings from a local path (editor) to the remote path (debugee). This setting is useful when working in a file system with symbolic links, running remote debugging, or debugging an executable compiled externally. The debug adapter will replace the local path with the remote path in all of the calls.<br/><p><br/><ul><li>`"from"`: The absolute local path to be replaced when passing paths to the debugger.<br/>(Default: `""`)<br/></li><li>`"to"`: The absolute remote path to be replaced when passing paths back to the client.<br/>(Default: `""`)<br/></li></ul><br/> | An array of mappings from a local path (editor) to the remote path (debugee). This setting is useful when working in a file system with symbolic links, running remote debugging, or debugging an executable compiled externally. The debug adapter will replace the local path with the remote path in all of the calls.  Overridden by `remotePath`.<br/><p><br/><ul><li>`"from"`: The absolute local path to be replaced when passing paths to the debugger.<br/>(Default: `""`)<br/></li><li>`"to"`: The absolute remote path to be replaced when passing paths back to the client.<br/>(Default: `""`)<br/></li></ul><br/> |
| `trace` | Various levels of logging shown in the debug console & 'Go Debug' output channel. When using the `legacy` debug adapter, the logs will also be written to a file if it is set to a value other than `error`.<br/><p>Allowed Values: `"verbose"`, `"trace"`, `"log"`, `"info"`, `"warn"`, `"error"`<br/>(Default: `"error"`)<br/> | <center>_same as Launch_</center>|
| `traceDirPath` | Directory in which the record trace is located or to be created for a new output trace. For use on 'replay' mode only<br/>(Default: `""`)<br/> | <center>_n/a_</center> |
| `waitFor` | <center>_n/a_</center> | Wait for a process with a name beginning with the given prefix<br/>(Default: `""`)<br/> |
<!-- SETTINGS END -->

⚠️ Delve resolves relative paths from `dlv dap` process's working directory, but
from which directory the extension spawns the `dlv dap` process is an
implementation detail. Thus, use
[the VS Code variables substitution](https://code.visualstudio.com/docs/editor/variables-reference)
to ensure consistent expansion of paths. VS Code will resolve the variables
inside strings in `launch.json` before passing the configuration to the Go
extension and `dlv dap`. For example, `${workspaceFolder}` will be replaced with
the absolute path to the workspace root folder. When appropriate, the Go
extension will resolve relative paths or home directory (~) before sending the
configuration to `dlv dap`.

### Debug symlink directories

Since the debugger and go compiler use the actual filenames, extra configuration
is required to debug symlinked directories. Use the `substitutePath` property to
tell the `debugAdapter` how to properly translate the paths. For example, if
your project lives in `/path/to/actual/helloWorld`, but the project is open in
vscode under the linked folder `/link/to/helloWorld`, you can add the following
to your config to set breakpoints in the files in `/link/to/helloWorld`:

```json
{
    "name": "Launch with symlinks",
    "type": "go",
    "request": "launch",
    "mode": "debug",
    "program": "/path/to/actual/helloWorld",
    "substitutePath": [
        {
            "from": "/link/to/helloWorld",
            "to": "/path/to/actual/helloWorld"
        }
    ]
}
```

<!--### Options for "Add Configuration"

TODO: clean up the snippets in package.json

TODO: auto-generate from package.json. -->

### Settings

You can adjust the default value of the following configuration properties using
`go.delveConfig` settings. These default values are useful when you choose to
run a debug session without the launch configuration set in `launch.json`. For
example, debug sessions started using the `Debug Test` code lenses use the
adjusted values from these settings.

* [`go.delveConfig`](settings.md#go.delveConfig)
  * `debugAdapter`: Controls which debug adapter to use (default: `legacy`).
    Select ‘dlv-dap’.
  * `showGlobalVariables`: Show global variables in the Debug view (default:
    `false`).
  * `substitutePath`: Path mappings to apply to get from a path in the editor to
    a path in the compiled program (default: `[]`).

⚠️ Where is the `dlvLoadConfig` setting? Delve debugger imposes variable loading
limits to avoid loading too many variables at once and negatively impacting
debugging latency. The legacy adapter supported `dlvLoadConfig` to adjust these
limits for the duration of the session. The user therefore had to come up with a
one-size-fits-all limit if the default behavior was not satisfactory. `dlv-dap`
mode uses a different approach as described in
[the Data Inspection section](#data-inspection). If this setting is configured
and `dlv-dap` mode is used, the extension will show a warning prompt now. If the
current variable loading behavior and internal limits are not working for you,
please [open an issue](https://github.com/golang/vscode-go/issues/new) and share
your feedback.

<p align="center"><img src="images/dlv-load-config-warning.png" alt="dlvLoadConfig is invalid" width="50%"> </p>

## Advanced topics

### Go debug extension architecture overview

VS Code implements a generic, language-agnostic debugger UI based on
[Debug Adapter Protocol](https://microsoft.github.io/debug-adapter-protocol/)
(DAP), an abstract protocol for communicating with debugger backend. Previously,
the Go extension used an intermediary typescript program (legacy debug adapter)
to launch Delve and adapt Delve to DAP. With
[the new, native DAP implementation in Delve](https://github.com/go-delve/delve/tree/master/service/dap),
the intermediary program is no longer necessary, and efficient and tight
integration with Delve becomes possible.

<p align="center"><img src="images/vscode-go-debug-arch.png" alt="vscode-go debug architecture"> </p>

For information on debugging using the legacy debug adapter, please see the old
[Debugging Documentation](debugging.md). Note that many new or enhanced features
discussed in this document may not be available with the legacy debug adapter.

### Handling STDIN

The Go extension and `dlv` started as a subprocess of the extension do not have
access to `tty`. The Go extension captures and forwards STDOUT/STDERR of the
debug program to VS Code, so they can appear in `DEBUG OUTPUT` panel. But this
arrangement does not handle STDIN.

When the target program needs to read from STDIN or access terminals (`tty`),
use the `"console"` launch option that controls where the `dlv` debugger and the
target process run:

* `integratedTerminal` for the terminal inside VS Code
* `externalTerminal` for the terminal outside VS Code

The Go extension delegates interaction with terminals to VS Code
[using Debug Adapter Protocol's `RunInTerminal` functionality](https://github.com/golang/vscode-go/discussions/1626).
For configuring VS Code's terminal related behavior, see VS Code's
[documentation](https://code.visualstudio.com/docs/editor/integrated-terminal).

### Debug programs and tests as root

In order to run and debug a program or a package test running as root, the
debugger (`dlv`) must run with root privilege, too. You can start the debug
session with root privilege utilizing the `"asRoot"` AND `"console"` launch
options. This is currently supported only on Linux and Mac.

When `asRoot` is true, the Go extension will use the `sudo` command to run
`dlv`. Since `sudo` may ask you to enter password, the debug session needs
[terminal access](#handling-stdin) so set `"console": "integratedTerminal"` or
`"console": "externalTerminal"` in the launch configuration.

#### Debug a program as root

For example, the following launch configuration will start `myprogram` and debug
it by running `sudo dlv dap` command in the integrated terminal.

```json
{
    "name": "Launch as Root",
    "request": "launch",
    "mode": "exec",
    "asRoot": true,
    "program": "${workspaceRoot}/myprogram",
    "console": "integratedTerminal",
    ...
}
```

The `asRoot` setting can be used with `auto`/`test`/`debug` launch modes that
**build** the target binary to debug. That means the `go` command will be
invoked as root to compile the binary, too. This can cause issues:

* by default, `sudo` does not preserve the user's current environment variables
  (see documentations about sudo's `--preserve-env` option). For example, `PATH`
  or library paths required for build may be different.
* Go environment variable settings usually associated in the home directory are
  different.
* Module/build caches used during build as root may be different from the caches
  used in your normal build. If they are the same, you may encounter permission
  errors due to cache data written to the caches as root.

Instead, you can arrange the `exec` launch mode to work with a pre-launch
[task](https://code.visualstudio.com/docs/editor/tasks).

First, configure a debug build task to compile the target binary.

In `.vscode/tasks.json`:

```json
{
    ...
    "tasks": [
        {
            "label": "go: build (debug)",
            "type": "shell",
            "command": "go",
            "args": [
                "build",
                "-gcflags=all=-N -l",
                "-o",
                "${fileDirname}/__debug_bin"
            ],
            "options": {
                "cwd": "${fileDirname}"
            },
            ...
        }
    ]
}
```

The `-gcflags=all=-N -l` flag tells the `go build` command to preserve the debug
information. The `-o` flag causes the compiled binary to be placed in
`"${fileDirname}/__debug_bin"`. Extra build flags and environment variables
_used for build_ should be configured here as `args` or `options`'s `env`
settings.

It might be useful to add `__debug_bin` to your `.gitignore` to avoid debugging
binaries getting checked-in into your repository.

Then, configure the launch config to run the task before starting debugging.

In `.vscode/launch.json`:

```json
    ...
    "configurations": [
        {
            "name": "Launch Package as root",
            "type": "go",
            "request": "launch",
            "mode": "exec",
            "asRoot": true,
            "console": "integratedTerminal",
            "program": "${fileDirname}/__debug_bin",
            "preLaunchTask": "go: build (debug)",
        }
    ]
```

Settings (`args`, `cwd`, `env`, ...) configured in the above `launch.json` will
only apply when _running_ the compiled binary, not when building the binary.

#### Debug a package test as root

To debug package tests as root add the following launch and task configurations.

In `.vscode/tasks.json`:

```json
    ...
    "tasks": [
        {
            ...
        },
        {
            "label": "go test (debug)",
            "type": "shell",
            "command": "go",
            "args": [
                "test",
                "-c",
                "-o",
                "${fileDirname}/__debug_bin"
            ],
            "options": {
                "cwd": "${fileDirname}",
            },
            ...
        }
    ]
```

In `.vscode/launch.json`:

```json
    ...
    "configurations": [
        {
            ...
        },
        {
            "name": "Debug Package Test as root",
            "type": "go",
            "request": "launch",
            "mode": "exec",
            "asRoot": true,
            "program": "${fileDirname}/__debug_bin",
            "cwd": "${fileDirname}",
            "console": "integratedTerminal",
            "preLaunchTask": "go test (debug)"
        }
    ]
```

### Manually install `dlv`

On rare occasions, you may want to install `dlv` by yourself instead of letting
the extension handle its installation.

First, find where the Go extension finds tools. Like
[other tools the extension uses](tools.md#tools), the Go extension searches the
`dlv` executable from `${GOPATH}/bin`, `${GOBIN}` and `${PATH}` (or `Path` in
Windows). So, install `dlv` in the directory. The easiest way to check the tool
installation location the Go extension uses is currently by running the
`Go: Locate Configured Go Tools` command from the command palette (⇧+⌘+P or
Ctrl+Shift+P).

If your Go version is 1.16 or newer:

```
GOBIN=<dir_to_install_dlv> go install github.com/go-delve/delve/cmd/dlv@latest
```

If your Go version is older than 1.16:

```
cd $(mktemp -d)
GO111MODULE=on GOBIN=<dir_to_install_dlv> go get github.com/go-delve/delve/cmd/dlv@latest
```

You can choose to install a different version of `dlv` by specifying a specific
commit hash, a branch name (e.g. `master`), or a released version instead of
`latest`. For more details about manual installation, see
[Delve's documentation](https://github.com/go-delve/delve/tree/master/Documentation/installation).

If you want to explicitly specify the location of the delve binary, use the
`go.alternateTools` setting:

```json5
"go.alternateTools": {
    "dlv": "<absolute path to your dlv binary>"
}
```

### Remote debugging

> If you are able to use the
> [Remote Development](https://aka.ms/vscode-remote/download/extension)
> extensions and VS Code’s universal
> [remote development capabilities](https://code.visualstudio.com/docs/remote/remote-overview),
> that is the recommended way to debug Go programs remotely. Check out
> [Getting started](https://code.visualstudio.com/docs/remote/remote-overview#_getting-started)
> section and
> [Remote tutorials](https://code.visualstudio.com/docs/remote/remote-overview#_remote-tutorials)
> to learn more.

Remote debugging is the debug mode commonly used to work with a debugger and
target running on a remote machine or a container. In spite of its name, it can
also be used on a local machine with server started in an external terminal
(e.g. to support entering stdin into the server's terminal window).

With the introduction of `dlv dap` users now have two options for remote (i.e.
external) debugging.

#### Connect to headless delve with target specified at server start-up

In this mode the user must first manually start a
[`dlv --headless`](https://github.com/go-delve/delve/tree/master/Documentation/api)
server listening at `host:port` while specifying the target program to
debug/test/exec or a process to attach to on the command-line. A
[remote attach](#attach) configuration is then used to connect to the debugger
with a running target.

The
[headless dlv server](https://github.com/go-delve/delve/tree/master/Documentation/api)
can now be used with both `"debugAdapter": "legacy"` (default value) and
`"debugAdapter": "dlv-dap"` (with Delve v1.7.3 or newer) as well as Delve's
[command-line interface](https://github.com/go-delve/delve/tree/master/Documentation/cli)
via `dlv connect`. The `--accept-multiclient` flag makes this a multi-use server
that persists on `Disconnect` from a client and allows repeated connections from
any of the aforementioned clients. A combination of
`--accept-multiclient --continue` flags can be used to resume process execution
on start-up. Please see `dlv --help` and `dlv [command] --help` for dlv's
command-line options.

We encourage you to give the newly added `"debugAdapter": "dlv-dap"` support a
try and to
[let us know of any issues](https://github.com/golang/vscode-go/issues/new). If
you need to use the `legacy` mode, please also see the
[legacy remote debugging](debugging-legacy.md#remote-debugging) documentation.

For example, start external headless server:

```
dlv debug /path/to/program/ --headless --listen=:12345 # also add as needed: --accept-multiclient --continue
```

Connect to it with a remote attach configuration in your `launch.json`:

```json5
{
    "name": "Connect to external session",
    "type": "go",
    "debugAdapter": "dlv-dap", // `legacy` by default
    "request": "attach",
    "mode": "remote",
    "port": 12345,
    "host": "127.0.0.1", // can skip for localhost
    "substitutePath": [
      { "from": "${workspaceFolder}", "to": "/path/to/remote/workspace" },
      ...
  ]
}
```

#### Connect to delve dap with target specified at client start-up

In this mode the user must first manually start a
[`dlv dap` server](https://github.com/go-delve/delve/blob/master/Documentation/usage/dlv_dap.md)
listening at `host:port` and then specify the target program via
[launch](#launch) or [attach](#attach) client config with a `"port"` attribute.
Instead of starting a new local server, the Go extension will tell VS Code to
connect to the server specified by `host:port` attributes and then send a
request with the target to debug. This option provides the flexibility of easily
adapting local configurations to connect to external servers, but ⚠️ must be
used with care since anyone who can connect to the server can make it run
arbitrary programs.

When using `launch` mode, the `program` attribute must point to the absolute
path of the package or binary to debug in the remote host’s file system even
when `substitutePath` is specified. When using `attach` mode outside of local
host, you need to specify the `processId` in the config since
[the processId resolution feature](#attach) cannot gather information about
processes running remotely.

<!-- TODO: update or remote this picture
<p align="center"><img src="images/remote-debugging.png" alt="Remote Debugging"> </p>
-->

Start a `dlv dap` server ready to accept a client request to launch or attach to
a target process:

```
dlv dap --listen=:12345
```

Use the following `launch` configuration to tell `dlv` to execute a binary
precompiled with `go build -gcflags=all="-N -l"`:

```json5
{
  "name": "Connect and launch",
  "type": "go",
  "debugAdapter": "dlv-dap", // the default
  "request": "launch",
  "port": 12345,
  "host": "127.0.0.1", // can skip for localhost
  "mode": "exec",
  "program": "/absolute/path/to/remote/workspace/program/executable",
  "substitutePath": [
      { "from": "${workspaceFolder}", "to": "/path/to/remote/workspace" },
      ...
  ]
}
```

Or have the binary compiled by `dlv dap` by modifying the above configuration to
use:

```json5
  "mode": "debug",
  "program": "/absolute/path/to/remote/workspace/package",
```

⚠️ Limitations

* Unlike `dlv --headless` above, `dlv dap` does not support
  `--accept-multiclient` or `--continue` flags, which means after a debug
  session ends, the `dlv dap` process will always exit.
* If you use `debug` or `test` mode `launch` requests, Delve builds the target
  binary. Delve tries to build the target from the directory where the `dlv`
  process is running, so make sure to run the `dlv` command from the directory
  you would run the `go build` or `go test` command.

### Run debugee externally

Sometimes you might like to launch the program for debugging outside of VS Code
(e.g. as a workaround of the missing `console` support to enter stdin via an
external terminal or separate target's output from debug session logging). There
are currently two options:

* Compile and run the target program from the external terminal and use
  [the "attach" configuration](#attach).
* Run the debug server from the external terminal with `--listen=:<port>` and
  have VS Code connect to it using `port` in your launch configuration (see
  ["Remote Debugging"](#remote-debugging) for more details)

## Troubleshooting

The suggestions below are intended to help you troubleshoot any problems you
encounter. If you are unable to resolve the issue, please take a look at the
[current known debugging issues](https://github.com/golang/vscode-go/issues?q=is%3Aissue+is%3Aopen+label%3ADebug)
or [report a new issue](#reporting-issues).

1. Read documentation and [FAQs](#faqs). Also check the
   [Delve FAQ](https://github.com/go-delve/delve/blob/master/Documentation/faq.md)
   in case the problem is mentioned there.
1. Check your `launch.json` configuration. Often error messages appearing in the
   DEBUG CONSOLE panel reveal issues.
1. Update Delve (`dlv`) to pick up most recent bug fixes. Follow
   [the instruction](debugging.md#staying-up-to-date).
1. Check if you can reproduce the issue with `dlv`, the command line tool from
   the integrated terminal. <!-- TODO(vscode-go): add instructions
   https://github.com/golang/vscode-go/issues/1931 --> If it's reproducible when
   using `dlv`, take a look at the
   [Delve project issue tracker](https://github.com/go-delve/delve/issues).
1. Capture [logs](debugging.md#collecting-logs) and inspect them.
1. Look at the
   [existing debugging issues](https://github.com/golang/vscode-go/labels/Debug)
   if similar issues were reported.
1. If none of these solve your problem, please
   [open a new issue](#reporting-issues).

## FAQs

### I need to view large strings. How can I do that if `dlvLoadConfig` with `maxStringLen` is deprecated?

The legacy adapter used `dlvLoadConfig` as one-time session-wide setting to
override dlv's conservative default variable loading limits, intended to protect
tool's performance. The new debug adapter is taking a different approach with
on-demand loading of composite data and updated string limits, relaxed when
interacting with individual strings. In particular, if the new default limit of
512, applied to all string values in the variables pane, is not sufficient, you
can take advantage of a larger limit of 4096 with one of the following:

* Hover over the variable in the source code
* `Copy as Expression` to query the string via REPL in the DEBUG CONSOLE panel
* `Copy Value` to clipboard

Please [open an issue](https://github.com/golang/vscode-go/issues/new) if this
is not sufficient for your use case or if you have any additional feedback.

### Why does my debug session have an `invalid command` error when I try to step?

When stepping through a program on a particular goroutine, the debugger will
make sure that the step is completed, even when interrupted by events on a
different goroutine. If a breakpoint is hit on a different goroutine, the debug
adapter will stop the program execution to allow you to inspect the state, even
though the step request is still active.

If you attempt to make another step request you will get an `invalid command`
error.

<p align="center"><img src="images/invalidCommandExceptionInfo.png" alt="Disable
breakpoints from the Breakpoints context menu" width="75%"> </p>

Use `Continue` to resume program execution.

If you do not want the step request to be interrupted, you can disable all
breakpoints from VS Code from the context menu in the `Breakpoints` view.

<p align="center"><img src="images/disablebps.png" alt="Disable breakpoints from
the Breakpoints context menu" width="75%"> </p>

### My program does not stop at breakpoints

Check the "BREAKPOINTS" section in the debug view and see if the breakpoints are
[greyed out](https://code.visualstudio.com/docs/editor/debugging#_breakpoints)
when your debug session is active. Setting `stopOnEntry` is a great way to pause
execution at the start to _verify_ breakpoints are set correctly. Or
[enable logging](#collecting-logs) and see if `setBreakpoints` requests
succeeded with all the breakpoints _verified_.

This problem often occurs when the source location used in compiling the
debugged program and the workspace directory VS Code uses are different. Common
culprits are remote debugging where the program is built in the remote location,
use of symbolic links, or use of `-trimpath` build flags. In this case,
configure the `substitutePath` attribute in your launch configuration.

#### Trimpath tips

If you are using `-trimpath` to build your program, you need to add entries to substitute
path to let the debugger know how to map the package paths that are compiled in the
binary to the files that you are looking at in the editor.

Here are some tips for configuring substitutePath. This assumes that your program is using module mode, which is the default.

One rule that you will need will map your main module. The mapping will map `"from"` the file path to the directory containing the module, `"to"` the module path.

You will also need to create a similar mapping for all dependencies. These include modules
in the module cache, vendored modules, and the standard library.

```json
"substitutePath": [
  // Main module.
  {
   "from": "${workspaceFolder}",
   "to": "moduleName",
  },
  // Module cache paths.
  {
   "from": "${env:HOME}/go/pkg/mod/github.com",
   "to": "github.com",
  },
  {
   "from": "${env:HOME}/go/pkg/mod/golang.org",
   "to": "golang.org",
  },
  ...
  // Standard library paths.
  // This rule should come last since the empty "to" will match every path.
  { "from": "/path/to/local/goroot/pkg" , "to": ""}
 ],
```

Since rules are applied both from client to server and server to client,
rules with an empty string will be applied to _all_ paths that it sees, so even
dependencies will be mapped to `"/path/to/module"`.

We plan to make this easier in the future. Progress can be tracked
in the issue tracker [golang/vscode-go#1985](https://github.com/golang/vscode-go/issues/1985).

### Debug sessions started with the "debug test" CodeLens or the test UI does not use my `launch.json` configuration

The "debug test" CodeLens and the [test UI](features.md#test-and-benchmark) do
not use the `launch.json` configuration
([Issue 855](https://github.com/golang/vscode-go/issues/855)). As a workaround,
use the `go.delveConfig` setting and the `go.testFlags` setting. Please note
that these all apply to all debug sessions unless overwritten by a specific
`launch.json` configuration.

### Starting a debug session fails with

`decoding dwarf section info at offset 0x0: too short` or
`could not open debug info` error

These errors indicate that your binary was built with linker flags that stripped
the symbol table (`-s`) or the DWARF debug information (`-w`), making debugging
impossible. If the binary is built while launching the session, make sure your
`launch.json` configuration does not contain
`"buildFlags": "--ldflags '-s -w'"`. If you use `debug test` or Test Explorer,
check `go.buildFlags` in `settings.json`. If the binary is built externally,
check the command-line flags and do not use `go run`. Unlike `go build`,
`go run` passes `-s -w` to the linker under the hood. If you try to attach to
such a binary with a debugger, it will fail with one of the above errors (see Go
Issue [24833](https://github.com/golang/go/issues/24833)). Instead let dlv build
the binary for you or use `go build -gcflags=all="-N -l"`.

## Report issues

When you are having issues in `dlv-dap` mode, first check if the problems are
reproducible after updating `dlv` and using the most recent version of `dlv`.
It's possible that the problems are already fixed. You can also try to install
`dlv` at tree head. Follow the instruction for
[updating `dlv`](#staying-up-to-date) and
[updating extension](https://code.visualstudio.com/docs/editor/extension-gallery#\_extension-autoupdate).

Please report issues in
[our issue tracker](https://github.com/golang/vscode-go/issues) with the
following information.

* `go version`
* `go version -m <path/to/dlv>`
* VS Code and VS Code Go version (e.g. `code --version`)
* Instructions to reproduce the issue (code snippets, your `launch.json`, screenshot)
* DAP trace (See [the instruction](#collecting-logs))

### Collect logs

```json5
{
    "name": "Launch file",
    "type": "go",
    "trace": "verbose",
    "showLog": true,
    "logOutput": "dap",
    ...
}
```

The `logOutput` and `showLog` attributes in `launch.json` enable Delve-side
logging (server-side) and DAP message tracing. The `trace` attribute controls
the verbosity of Go extension's side logging (client-side).

The logging will appear in the `Go Debug` output channel (Command Palette ->
"View: Toggle Output" -> Select "Go Debug" from the dropdown menu). By nature,
debug logs may contain sensitive information. Please review the logs carefully
before sharing debug logs.

## Development

### Code location

The core part of Delve DAP implementation is in the
[`service/dap`](https://github.com/go-delve/delve/tree/master/service/dap)
package. Follow Delve project's
[contribution guideline](https://github.com/go-delve/delve/blob/master/CONTRIBUTING.md#contributing-code)
to send PRs.

Code for integration with the Go extension is mostly in
[`src/goDebugFactory.ts`](https://github.com/golang/vscode-go/blob/master/extension/src/goDebugFactory.ts)
and tests are in
[`test/integration/goDebug.test.ts`](https://github.com/golang/vscode-go/blob/master/extension/test/integration/goDebug.test.ts).
Please take a look at VS Code Go project's
[contribution guideline](contributing.md) to learn about how to prepare a change
and send it for review.

### Testing

For simple launch cases, build the `dlv` binary, and configure
`"go.alternateTools"` setting.

```json5
"go.alternateTools": {
    "dlv": <path_to_your_dlv>
}
```

<p align="center"><img src="images/debug-output.png" alt="Go Debug output
channel" width="100%"></p> If you are having issues with seeing logs and/or
suspect problems in the extension's integration, you can start the Delve DAP
server from a separate terminal and configure the extension to directly connect
to it. Please remember to
[file an issue](https://github.com/golang/vscode-go/issues/new) if you encounter
any logging-related problems.

```
dlv dap --listen=:12345 --log --log-output=dap
```

```json5
{
    "name": "Launch file",
    "type": "go",
    "request": "launch",
    "debugAdapter": "dlv-dap",
    ...
    "port": 12345
}
```
