英文:
Why does debugging Go with VS Code and WSL hang Delve?
问题
我正在尝试在使用WSL的VS Code中调试一个Go程序。该程序可以编译和运行,但是在使用dlv dap进行调试时,似乎会挂起并且永远无法达到第一个断点。我使用的是go 1.17、dlv 1.7.2和Ubuntu 20.04。这个问题在简单的Hello World程序中复现:
package main
import "fmt"
func main() {
fmt.Println("hello world")
}
如果我选择运行->无调试运行,调试控制台显示:
Starting: /mnt/f/mattm/home/go/bin/dlv-dap dap
--check-go-version=false --only-same-user=false --listen=127.0.0.1:53252 --log=true --log-output=rpc --log-dest=3 from /mnt/f/mattm/home/hw
DAP server listening at: 127.0.0.1:53252
hello world
Process 17851 has exited with status 0 dlv dap (17754) exited with code: 0
程序已成功运行并退出(尽管如果不进行调试,为什么要启动dlv呢?)。但是,如果我尝试运行->开始调试,控制台窗口只显示:
Starting: /mnt/f/mattm/home/go/bin/dlv-dap dap
--check-go-version=false --only-same-user=false --listen=127.0.0.1:56084 --log=true --log-output=rpc --log-dest=3 from /mnt/f/mattm/home/hw
DAP server listening at: 127.0.0.1:56084
程序似乎没有执行,VS Code从未显示执行达到断点的情况。(无论是否设置了断点,结果都是相同的)。任务管理器显示正在运行一个dlv-dap进程;它似乎被挂起并等待某些东西。但是等待什么呢?如果我在VS Code下终止调试,dlv-dap进程仍然存在。就好像VS Code启动了dlv进程,然后忘记了它。我需要提示VS Code连接到DAP服务器以继续吗?我该如何做到这一点?
补充说明:
我使用以下启动配置:
"name": "Launch Package",
"type": "go",
"request": "launch",
"mode": "debug",
"program": "${fileDirname}",
"logOutput": "dap,debugger",
"showLog": true,
"dlvFlags" : ["--only-same-user=false"]
在打开详细的dlv日志记录后(如上面的配置),我得到以下结果:
Starting: /mnt/f/mattm/home/go/bin/dlv-dap dap
--check-go-version=false --only-same-user=false --listen=127.0.0.1:51444 --log=true --log-output=dap,debugger --log-dest=3 from /mnt/f/mattm/home/breezepms/hello-world DAP server listening at: 127.0.0.1:51444 2021-10-17T16:35:27+01:00 debug
layer=dap DAP server pid = 7019 2021-10-17T16:35:27+01:00 debug
layer=dap DAP connection started 2021-10-17T16:35:27+01:00 debug
layer=dap [<- from
client]{"seq":1,"type":"request","command":"initialize","arguments":{"clientID":"vscode","clientName":"Visual
Studio
Code","adapterID":"go","locale":"en-gb","linesStartAt1":true,"columnsStartAt1":true,"pathFormat":"path","supportsVariableType":true,"supportsVariablePaging":true,"supportsRunInTerminalRequest":true,"supportsMemoryReferences":true,"supportsProgressReporting":true,"supportsInvalidatedEvent":true}}
2021-10-17T16:35:27+01:00 debug layer=dap [-> to
client]{"seq":0,"type":"response","request_seq":1,"success":true,"command":"initialize","body":{"supportsConfigurationDoneRequest":true,"supportsFunctionBreakpoints":true,"supportsConditionalBreakpoints":true,"supportsEvaluateForHovers":true,"supportsSetVariable":true,"supportsExceptionInfoRequest":true,"supportTerminateDebuggee":true,"supportsDelayedStackTraceLoading":true,"supportsLogPoints":true,"supportsClipboardContext":true,"supportsSteppingGranularity":true}}
2021-10-17T16:35:27+01:00 debug layer=dap [<- from
client]{"seq":2,"type":"request","command":"launch","arguments":{"name":"Launch
file","type":"go","request":"launch","mode":"debug","program":"./hello-world.go","logOutput":"dap,debugger","showLog":true,"dlvFlags":["--only-same-user=false"],"__configurationTarget":5,"packagePathToGoModPathMap":{"/mnt/f/mattm/home/breezepms/web/xmlutilities":"/mnt/f/mattm/home/breezepms/web/xmlutilities","/mnt/f/mattm/home/breezepms/ledgers":"/mnt/f/mattm/home/breezepms/ledgers","/mnt/f/mattm/home/breezepms/web":"/mnt/f/mattm/home/breezepms","/mnt/f/mattm/home/breezepms/web/filehandling":"/mnt/f/mattm/home/breezepms/web/filehandling","/mnt/f/mattm/home/breezepms/persistence":"/mnt/f/mattm/home/breezepms/persistence","/mnt/f/mattm/home/breezepms/cmd/csvloader":"/mnt/f/mattm/home/breezepms","/mnt/f/mattm/home/breezepms/hello-world":"/mnt/f/mattm/home/breezepms"},"debugAdapter":"dlv-dap","apiVersion":2,"dlvLoadConfig":{"followPointers":true,"maxVariableRecurse":1,"maxStringLen":64,"maxArrayValues":64,"maxStructFields":-1},"showGlobalVariables":false,"substitutePath":[],"dlvToolPath":"/mnt/f/mattm/home/go/bin/dlv-dap","env":{},"__buildDir":"/mnt/f/mattm/home/breezepms/hello-world","__sessionId":"8e201eb7-88ec-452f-896d-3d5e98596c05"}}
2021-10-17T16:35:27+01:00 debug layer=dap debug backend is 'default'
2021-10-17T16:35:27+01:00 debug layer=dap building program
'./hello-world.go' in '/mnt/f/mattm/home/breezepms/hello-world' with
flags '' 2021-10-17T16:35:29+01:00 debug layer=dap running binary
'/tmp/__debug_bin3449446367' in '.' 2021-10-17T16:35:29+01:00 info
layer=debugger launching process with args:
[/tmp/__debug_bin3449446367]
英文:
I am trying to debug a Go program in VS Code, using WSL. The program compiles and runs, but when trying to debug with dlv dap, it seems to hang and never reach the first breakpoint. I am using go 1.17, dlv 1.7.2 and Ubuntu 20.04. The problem is replicated with the simple Hello World program:
package main
import "fmt"
func main() {
fmt.Println("hello world")
}
If I chose Run->Run Without Debugging, the Debug Consol shows
> Starting: /mnt/f/mattm/home/go/bin/dlv-dap dap
> --check-go-version=false --only-same-user=false --listen=127.0.0.1:53252 --log=true --log-output=rpc --log-dest=3 from /mnt/f/mattm/home/hw <br>DAP server listening at: 127.0.0.1:53252 <br>
> hello world <br>
> Process 17851 has exited with status 0 dlv dap (17754) exited with code: 0
The program has run and exited successfully (though why start dlv if not debugging?) But if I try to Run->Start Debugging, the console window only shows:
> Starting: /mnt/f/mattm/home/go/bin/dlv-dap dap
> --check-go-version=false --only-same-user=false --listen=127.0.0.1:56084 --log=true --log-output=rpc --log-dest=3 from /mnt/f/mattm/home/hw <br> DAP server listening at: 127.0.0.1:56084
The program does not appear to execute, VS Code never shows execution reaching a breakpoint. (The outcome is the same whether or not I've set breakpoints). Task Manager does show a dlv-dap process running; it appears to be hung and waiting for something. But what? If I terminate debugging under VS Code, the dlv-dap process remains. It is as though VS Code spun off the dlv process and then forgotten about it. Do I need to prompt VS Code to connect to the DAP server to proceed? How do I do that?
Addendum:
I am using the following launch configuration:
"name": "Launch Package",
"type": "go",
"request": "launch",
"mode": "debug",
"program": "${fileDirname}",
"logOutput": "dap,debugger",
"showLog": true,
"dlvFlags" : ["--only-same-user=false"]
After turning on verbose dlv logging (as in the config above), I get the following:
> Starting: /mnt/f/mattm/home/go/bin/dlv-dap dap
> --check-go-version=false --only-same-user=false --listen=127.0.0.1:51444 --log=true --log-output=dap,debugger --log-dest=3 from /mnt/f/mattm/home/breezepms/hello-world DAP server listening at: 127.0.0.1:51444 2021-10-17T16:35:27+01:00 debug
> layer=dap DAP server pid = 7019 2021-10-17T16:35:27+01:00 debug
> layer=dap DAP connection started 2021-10-17T16:35:27+01:00 debug
> layer=dap [<- from
> client]{"seq":1,"type":"request","command":"initialize","arguments":{"clientID":"vscode","clientName":"Visual
> Studio
> Code","adapterID":"go","locale":"en-gb","linesStartAt1":true,"columnsStartAt1":true,"pathFormat":"path","supportsVariableType":true,"supportsVariablePaging":true,"supportsRunInTerminalRequest":true,"supportsMemoryReferences":true,"supportsProgressReporting":true,"supportsInvalidatedEvent":true}}
> 2021-10-17T16:35:27+01:00 debug layer=dap [-> to
> client]{"seq":0,"type":"response","request_seq":1,"success":true,"command":"initialize","body":{"supportsConfigurationDoneRequest":true,"supportsFunctionBreakpoints":true,"supportsConditionalBreakpoints":true,"supportsEvaluateForHovers":true,"supportsSetVariable":true,"supportsExceptionInfoRequest":true,"supportTerminateDebuggee":true,"supportsDelayedStackTraceLoading":true,"supportsLogPoints":true,"supportsClipboardContext":true,"supportsSteppingGranularity":true}}
> 2021-10-17T16:35:27+01:00 debug layer=dap [<- from
> client]{"seq":2,"type":"request","command":"launch","arguments":{"name":"Launch
> file","type":"go","request":"launch","mode":"debug","program":"./hello-world.go","logOutput":"dap,debugger","showLog":true,"dlvFlags":["--only-same-user=false"],"__configurationTarget":5,"packagePathToGoModPathMap":{"/mnt/f/mattm/home/breezepms/web/xmlutilities":"/mnt/f/mattm/home/breezepms/web/xmlutilities","/mnt/f/mattm/home/breezepms/ledgers":"/mnt/f/mattm/home/breezepms/ledgers","/mnt/f/mattm/home/breezepms/web":"/mnt/f/mattm/home/breezepms","/mnt/f/mattm/home/breezepms/web/filehandling":"/mnt/f/mattm/home/breezepms/web/filehandling","/mnt/f/mattm/home/breezepms/persistence":"/mnt/f/mattm/home/breezepms/persistence","/mnt/f/mattm/home/breezepms/cmd/csvloader":"/mnt/f/mattm/home/breezepms","/mnt/f/mattm/home/breezepms/hello-world":"/mnt/f/mattm/home/breezepms"},"debugAdapter":"dlv-dap","apiVersion":2,"dlvLoadConfig":{"followPointers":true,"maxVariableRecurse":1,"maxStringLen":64,"maxArrayValues":64,"maxStructFields":-1},"showGlobalVariables":false,"substitutePath":[],"dlvToolPath":"/mnt/f/mattm/home/go/bin/dlv-dap","env":{},"__buildDir":"/mnt/f/mattm/home/breezepms/hello-world","__sessionId":"8e201eb7-88ec-452f-896d-3d5e98596c05"}}
> 2021-10-17T16:35:27+01:00 debug layer=dap debug backend is 'default'
> 2021-10-17T16:35:27+01:00 debug layer=dap building program
> './hello-world.go' in '/mnt/f/mattm/home/breezepms/hello-world' with
> flags '' 2021-10-17T16:35:29+01:00 debug layer=dap running binary
> '/tmp/__debug_bin3449446367' in '.' 2021-10-17T16:35:29+01:00 info
> layer=debugger launching process with args:
> [/tmp/__debug_bin3449446367]
答案1
得分: 2
上面的评论帮助我找到了解决方案。问题不在于VS Code本身,而是底层的dlv无法正常工作。在互联网上有一些关于这个问题的文档,可以在https://github.com/microsoft/WSL/issues/2977找到。dlv在WSL 1中不起作用。尽管我以为我已经升级到了WSL 2,但我没有将我的Ubuntu安装升级到WSL 2。在重新安装Ubuntu 20.04并安装go和dlv之后,我能够从VS Code进行调试。
英文:
The comments above helped me find a solution. The problem wasn't in VS Code itself, rather underlying dlv was unable to function properly. There is some documentation of the issue around the Internet https://github.com/microsoft/WSL/issues/2977. dlv does not work in WSL 1. Though I thought I had upgraded to WSL 2, I had not upgraded my Ubuntu installation to WLS 2. After re-installing Ubuntu 20.04 under WSL 2, (and reinstalling go and dlv) I was able to debug from VS Code.
答案2
得分: 2
我认为我来晚了,但无论如何,在WSL上无法使用Delve,但是由于现在WSL2可用,您现在可以使用它。
在我的情况下,我按照以下步骤操作:
- 在WSL 2(或远程主机)中安装Delve:
go install github.com/go-delve/delve/cmd/dlv@latest
- 使用以下标志(-gcflags "all=-N -l")编译和启动应用程序,以允许Delve收集高级调试信息。例如:
go run cmd/server/main.go -gcflags "all=-N -l"
- 要在WSL 2中进行调试,首先需要运行一个无头的Delve服务器:
dlv debug cmd/server/main.go --headless --listen=:2345 --log --api-version=2
- 在VSCode中设置launch.json:
...
{
"version": "0.2.0",
"configurations": [
{
"name": "Example Debug WSL2",
"type": "go",
"debugAdapter": "dlv-dap",
"request": "attach",
"mode": "remote",
"remotePath": "${workspaceFolder}",
"port": 2345,
"host": "127.0.0.1"
}
]
}
...
以下是一些有关更多详细信息的有用文档:
https://github.com/golang/vscode-go/blob/master/docs/debugging.md#remote-debugging
https://go.googlesource.com/vscode-go/+/refs/heads/dev.go2go/docs/debugging.md
https://jerome-ran.medium.com/golang-remote-debugging-with-visual-studio-code-a918de5d83f3
这些链接拯救了我的生命,希望对您有所帮助。
英文:
I think I'm coming late but anyway, it's not possible to get delve working on WSL, but since WSL2 become avaliable now you can.
In my case I could do it by following these steps:
1- Install Delve inside WSL 2 (Or remote host)
go install github.com/go-delve/delve/cmd/dlv@latest
2- Compile and launch my application with the following flag (-gcflags "all=-N -l") to allow Delve to collect advanced debugging information. E.g. :
go run cmd/server/main.go -gcflags "all=-N -l"
3- To debug inside WLS 2, I first had to run a headless Delve server by running:
dlv debug cmd/server/main.go --headless --listen=:2345 --log --api-version=2
4- Setup the launch.json in VSCode
...
{
"version": "0.2.0",
"configurations": [
{
"name": "Example Debug WSL2",
"type": "go",
"debugAdapter": "dlv-dap",
"request": "attach",
"mode": "remote",
"remotePath": "${workspaceFolder}",
"port": 2345,
"host": "127.0.0.1"
}
]
}
...
Here are some useful documentation for furthermore details.
https://github.com/golang/vscode-go/blob/master/docs/debugging.md#remote-debugging
https://go.googlesource.com/vscode-go/+/refs/heads/dev.go2go/docs/debugging.md
https://jerome-ran.medium.com/golang-remote-debugging-with-visual-studio-code-a918de5d83f3
These links saved my life, hope this helps.
答案3
得分: 0
我在使用WSL2和Windows 10下的VSCode调试配置中遇到了很多问题,特别是使用Delve。感谢@Potemkin在这里的帖子给了我一些关于这个主题的第一手见解。
以下是我的工作配置:
- 在WSL2中安装Delve调试服务器:
git clone https://github.com/go-delve/delve
cd delve
go install github.com/go-delve/delve/cmd/dlv
参考链接:https://github.com/go-delve/delve/tree/master/Documentation/installation#installation
PS:如果你的GOBIN目录没有在PATH变量中引用,你需要使用绝对路径执行dlv二进制文件:$HOME/go/bin/dlv
- 在WSL2中运行Delve调试服务器:
cd <your-golang-project>
dlv debug ./main.go --headless --listen=127.0.0.1:12345 --accept-multiclient --continue --only-same-user=false
在使用WSL2和Windows时,only-same-user参数非常重要,否则你可能会遇到以下错误信息:closing connection from different user (127.0.0.1:34406): connections to localhost are only accepted from the same UNIX user for security reasons
。
此外,如果不在listen参数中明确指定127.0.0.1回环地址,对我来说是无法工作的(只使用listen=:12345是不行的)!
关于使用Delve和VSCode进行远程调试的更多信息,请参考:https://github.com/golang/vscode-go/blob/master/docs/debugging.md#remote-debugging
- 在VSCode Studio的运行和调试选项卡中使用以下launch.json,并开始调试:
{
"version": "0.2.0",
"configurations": [
{
"name": "Example Debug WSL2",
"type": "go",
"request": "attach",
"mode": "remote",
"port": 12345,
"host": "127.0.0.1"
}
]
}
我还尝试在launch.json中使用"debugAdapter": "dlv-dap"配置,但是当达到断点时,出现了"could not find file..."的错误消息。使用上述配置中默认的旧版debugAdapter时,一切正常。
英文:
I went through hell with my vscode debug configuration using delve under wsl2 and vscode studio under windows 10. Thanks to @Potemkin post here for giving me the first insights to this topic.
Here is my working configuration:
- Install delve debug server in wsl2:
git clone https://github.com/go-delve/delve
cd delve
go install github.com/go-delve/delve/cmd/dlv
See: https://github.com/go-delve/delve/tree/master/Documentation/installation#installation
PS: If your GOBIN directory isnt in your PATH variable referenced, you have to execute the dlv binary by using the absolute path: $HOME/go/bin/dlv
- Run delve debug server in wsl2:
cd <your-golang-project>
dlv debug ./main.go --headless --listen=127.0.0.1:12345 --accept-multiclient --continue --only-same-user=false
The only-same-user parameter is very important when you are using wsl2 and windows cause otherwise you could end up having this error message: closing connection from different user (127.0.0.1:34406): connections to localhost are only accepted from the same UNIX user for security reasons
.
Furthermore without stating explicitly the 127.0.0.1 loopback adress in the listen parameter it wasnt working for me (just using
listen=:12345 didnt worked)!
Further information about remote debugging with delve and vscode you will find here: https://github.com/golang/vscode-go/blob/master/docs/debugging.md#remote-debugging
- Use this launch.json in run and debug tab in vscode studio and start debugging:
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Example Debug WSL2",
"type": "go",
"request": "attach",
"mode": "remote",
"port": 12345,
"host": "127.0.0.1"
}
]
}
I also tried to use the "debugAdapter": "dlv-dap" configuration in my launch.json, but that ended up with the error message "could not find file..." when reaching a breakpoint. With the default legacy debugAdapeter as used with the config stated above it works fine.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论