修复 GoLand 调试 WSL2 中的项目时卡住的问题

修复 GoLand 调试 WSL2 中的项目时卡住的问题

💡 原文中文,约1200字,阅读约需3分钟。
📝

内容提要

在使用GoLand调试WSL2中的项目时,可能会出现卡住的问题。解决方法有两种:关闭镜像网络模式和修改delve。关闭镜像网络模式可以在.wslconfig文件中注释掉networkingMode=mirrored。修改delve需要下载源码,在commands.go文件中的execute函数开头加上一行代码,然后编译成可执行文件替换GoLand中的同名文件。参考链接:Debugger fails to connect when running with WSL 2.

🔎

延伸解读

问题根源:WSL2 镜像网络模式与 delve 监听冲突

文章指出,调试卡住是因为 WSL2 的镜像网络模式无法监听 delve 使用的 0.0.0.0 地址。这导致 GoLand 调试窗口无法 Step Into,并出现警告信息。理解这一点有助于判断问题是否由网络模式引起,而非代码或调试器本身故障。

两种解决路径的适用场景与取舍

方法一通过注释 .wslconfig 中的 networkingMode=mirrored 关闭镜像网络模式,操作简单但可能影响依赖该模式的网络功能。方法二修改 delve 源码,将监听地址从 0.0.0.0 替换为 127.0.0.1,更针对调试场景,但需下载源码、编译并替换 GoLand 插件中的 dlv 文件,步骤较多。

修改 delve 的关键步骤与验证

若选择修改 delve,需在 commands.go 的 execute 函数开头添加 addr = strings.ReplaceAll(addr, "0.0.0.0:", "127.0.0.1:"),然后运行 go test -v ./cmd/dlv/ 测试,再用 CGO_ENABLED=0 GOOS=linux go build -o dlv cmd/dlv/main.go 编译,最后替换 GoLand 插件目录下的 dlv 文件。文章确认修改后可正常调试。

❓

Q&A

GoLand 调试 WSL2 项目时卡住,有什么解决方法?

有两种解决方法:一是关闭 WSL2 的镜像网络模式,在 %UserProfile%/.wslconfig 文件中注释掉 networkingMode=mirrored;二是修改 delve 源码,在 commands.go 的 execute 函数开头添加 addr = strings.ReplaceAll(addr, "0.0.0.0:", "127.0.0.1:"),然后编译替换 GoLand 中的 dlv 文件。

为什么 GoLand 调试 WSL2 项目时会卡住?

这是因为 WSL2 的镜像网络模式无法监听调试工具 delve 使用的 0.0.0.0 地址,导致调试窗口卡住,无法 Step Into。

如何关闭 WSL2 的镜像网络模式?

在 %UserProfile%/.wslconfig 文件中注释掉 networkingMode=mirrored 即可关闭镜像网络模式。

如何修改 delve 以解决调试卡住问题?

下载 delve 源码,找到 delve\cmd\dlv\cmds\commands.go 下的 execute 函数,在函数开头添加 addr = strings.ReplaceAll(addr, "0.0.0.0:", "127.0.0.1:"),然后编译并替换 GoLand 中的 dlv 文件。

修改 delve 后如何编译和替换?

使用命令 CGO_ENABLED=0 GOOS=linux go build -o dlv cmd/dlv/main.go 编译,然后将生成的可执行文件替换 GoLand 中的同名文件,路径如 C:\Program Files\JetBrains\GoLand 2023.3.2\plugins\go-plugin\lib\dlv\linux\dlv。

修改 delve 后如何测试是否有效?

可以运行 go test -v ./cmd/dlv/ 来测试,最后测试发现可以正常调试。

🏷️

标签

➡️

继续阅读