delve
有两种方法可以安装delve
:
Go: Install/Update Tools
,然后选择dlv
,点击ok
来安装或者更新delve
settings
中进行设置调试器使用以下的设置项,你可能不需要添加/更改它们中的任何一个,以便在简单的情况下进行调试,但有时会给它们读取一些配置:
go.gopath
,查看扩展程序中设置GOPATH
]go.inferGopath
,查看扩展程序中设置GOPATH
go.delveConfig
:apiVersion
:控制将要在无头服务中被使用的delve apis
的版本,默认值为2。dlvLoadConfig
:当apiVersion
为1时不适用。这个配置会传递给delve
。控制delve
的各种功能,这些功能会影响调试窗格中显示的变量。maxStringLen
:从字符串中读取的最大字节数maxArrayValues
:从数组,切片或map
中读取的最大元素数maxStructFields
:从结构体中读取的最大字段数,-1
表示将读取所有字段maxVariableRecurse
:评估嵌套类型时递归的程度followPointers
:请求指针自动解除引用一些常见的情况,可能想要调整传递给delve的配置:
launch.json
中设置配置项安装delve
后,运行命令Debug:Open launch.json
。如果还没有launch.json
文件,则会创建一个具有以下默认配置的文件,该配置可用于调试当前包。
{
"version": "0.2.0",
"configurations": [
{
"name": "Launch",
"type": "go",
"request": "launch",
"mode": "auto",
"program": "${fileDirname}",
"env": {},
"args": []
}
]
}
以下是可以在调试配置中调整的一些常见属性的更多信息:
属性 | 描述 |
---|---|
name | Debug视图下拉列表中显示的配置的名称 |
type | 始终设置为“go” ,VS Code使用它来确定应该使用哪个扩展程序来调试代码 |
request | launch 或者attach ,使用attach 当需要附加到一个已经在运行中的程序 |
mode | 对于上个属性中的launch ,可选择auto ,debug ,remote ,test ,exec ;对于上个属性中的attach ,可选择local ,remote |
program | 在debug 和test 模式下,指定要调试的包或文件的绝对路径,或者在exec 模式下调试的预构建二进制文件的绝对路径;不适用于attach |
env | 调试时要使用的环境变量,如{ "ENVNAME": "ENVVALUE" } |
envFile | 包含环境变量定义的文件的绝对路径,env 属性中传递的环境变量会覆盖此文件中的变量 |
args | 将传递给正在调试的程序的命令行参数数组 |
showLogs | 布尔值,指示是否应在调试控制台中打印来自delve 的日志 |
logOutput | 以逗号分隔的delve 组件列表(debugger ,gdbwire ,lldbout ,debuglineerr ,rpc ),当设置为true时应生成调试输出 |
buildFlags | 要传递给Go编译器的构建(build )标志 |
remotePath | 远程调试时远程计算机上正在调试的文件的绝对路径,即mode 设置为remote 。有关详细信息,请参阅“远程调试”一节 |
processeid | 仅在使用local mode的attach request时适用,这是运行需要调试的可执行文件的进程的id |
VSCode
变量调试配置中采用文件夹/文件路径的任何属性都可以使用以下VSCode
变量:
${workspaceFolder}
:调试在VSCode
中打开的工作空间的根目录下的程序包${file}
:调试当前文件${fileDirname}
:调试当前文件所属的包如果构建时需要构建标记(例如go build -tags=whatever_tag
),那么添加参数buildFlags
,内容为“-tags=whatever_tag
”。
支持多个标记,将它们用双引号括起来,如下所示:“-tags='first_tag second_tag third_tag'”
。
编辑launch.json
文件时,可以使用代码段进行调试配置。输入“Go”
,将获得用于调试当前文件/包,测试功能等的片段。
{
"name": "Launch file",
"type": "go",
"request": "launch",
"mode": "auto",
"program": "${file}"
}
{
"name": "Launch test function",
"type": "go",
"request": "launch",
"mode": "test",
"program": "${workspaceFolder}",
"args": [
"-test.run",
"MyTestFunction"
]
}
{
"name": "Launch test package",
"type": "go",
"request": "launch",
"mode": "test",
"program": "${workspaceFolder}"
}
{
"name": "Launch executable",
"type": "go",
"request": "launch",
"mode": "exec",
"program": "absolute-path-to-the-executable"
}
processId
附加到已在运行的本地进程的示例配置{
"name": "Attach to local process",
"type": "go",
"request": "attach",
"mode": "local",
"processId": 0
}
要使用VSCode
进行远程调试,必须首先在目标计算机上运行无头的Delve
服务器。例如:
dlv debug --headless --listen=:2345 --log --api-version=2
要传递给正在调试的程序的任何参数都必须传递给在目标计算机上运行的Delve
服务器。例如:
dlv debug --headless --listen=:2345 --log -- -myArg=123
然后,在VS Code launch.json
中创建远程调试配置。
{
"name": "Launch remote",
"type": "go",
"request": "launch",
"mode": "remote",
"remotePath": "absolute-path-to-the-file-being-debugged-on-the-remote-machine",
"port": 2345,
"host": "127.0.0.1",
"program": "absolute-path-to-the-file-on-the-local-machine",
"env": {}
}
dlv
服务器和VScode调试器。根据在远程计算机上的设置更新端口和主机。remotePath
应指向远程计算机中正在调试的文件(在源代码中)的绝对路径program
应指向本地计算机上与remotePath
中对应的文件的绝对路径当选择此新的Launch remote
目标启动调试器时,VS Code
会将调试命令发送到之前启动的dlv
服务器,而不是针对应用启动它自己的dlv
实例。
请参阅这篇文章中调试在docker主机中运行的进程的示例。
如果在调试Go代码时遇到问题,请首先尝试更新的delve
版本,以确保使用的是最新版本,并且已使用当前的Go版本进行编译。要执行此操作,请运行命令Go:Install/Update Tools
,选择dlv
,然后点击ok
。
showLog
属性设置为true
。将从delve
中看到调试控制台中的日志。trace
属性以进行记录。将从Go扩展程序的调试适配器中看到调试控制台中的日志。这些日志将保存到一个文件,该文件的路径将在调试控制台的开头打印。logOutput
属性设置为rpc
。将看到对应于在VS Code
和delve
之间来回传递的RPC
消息的日志。请注意,首先需要将showLog
设置为true
。logOutput
属性对应于delve
使用的--log-output
标志,可以是一个逗号分隔的组件列表,它应该生成调试输出。如果想深入挖掘并使用此扩展程序的源代码调试调试器,请参阅build-and-debugging-the-extension。
确保正在调试的二进制文件是在没有优化的情况下构建的。在构建二进制文件时使用标志
-gcflags="all = -N -l"
。
调试器没有使用正确的GOPATH
。这不应该发生,如果确实如此,请记录一个错误。
在记录的错误被解决之前,解决方法是在
launch.json
文件的env
属性中将GOPATH
添加为env var
。
dlv
从命令行运行得很好,但VS Code
提供此访问相关的错误。如果扩展程序试图从错误的位置运行dlv
二进制文件,则会发生这种情况。Go扩展首先尝试在$GOPATH/bin
中找到dlv
,然后在$PATH
中找到。
解决方案:在命令行中运行
dlv
。如果这与GOPATH/bin
不匹配,则删除GOPATH/bin
中的dlv
文件
可以在调试控制台中看到此信息,同时尝试在测试模式下运行。当程序属性指向没有测试文件的文件夹时,会发生这种情况。
解决方案:确保程序属性指向包含要运行的测试文件的文件夹
could not launch process: could not fork/exec
由于签名问题,这通常发生在OSX中。请参阅讨论,请参阅#717,#269和derekparker/delve/357
解决方案:可能必须卸载
dlv
并按照说明手动安装它
Docker具有安全设置,可以在容器内默认阻止ptrace(2)
操作。
解决方案:要不安全地运行容器,请在启动时将
--security-opt=seccomp:unconfined
传递给docker
。参考:derekparker/delve/515
could not launch process: exec: "lldb-server": executable file not found in $PATH
对于使用版本
0.12.2
或更高版本的版本的Mac
用户,此错误可能会显示。不知道为什么,但是做xcode-select --install
已经解决了看到这个问题的用户的问题。
检查
remote delve process
使用的delve api
的版本,即检查标志-api-version
的值。这需要匹配Go扩展程序使用的版本,默认情况下使用版本2。可以通过编辑launch.json
文件中的调试配置来更改扩展使用的api
版本。
dlv
将
"trace":"log"
添加到调试配置并在VS Code
中调试。这会将日志发送到调试控制台,可以在其中查看对dlv
的实际调用。可以复制并在终端中运行它