必须用dlv exec启动已编译二进制,禁用优化(-n -l),remotepath须为远程dlv启动时pwd的绝对路径;launch.json中request为"attach"、mode为"remote"、apiversion显式设为2,且host/port需与--listen完全匹配。

直接调试远程 Golang 微服务,必须用 dlv exec 启动已编译二进制,不能靠 dlv debug 临时编译——后者在远程缺依赖、无 go.mod 或 GOPATH 错乱时必然失败。
remotePath 填错导致断点全灰
VS Code 不同步源码,remotePath 不是“你本地代码在哪”,而是远程 dlv exec 启动时的当前工作目录 + 二进制路径的绝对拼接结果。
- 如果远程执行
cd /home/user/service && dlv exec ./svc,remotePath必须写/home/user/service,不能写/home/user/service/.或./svc - Windows 远程时填
D:\service,别用D:/service—— VS Code Go 扩展对反斜杠更敏感 - 没源码只调二进制?直接删掉
remotePath字段,否则断点匹配失败
launch.json 必须显式设 apiVersion: 2
Delve v1 API 已弃用,不写 "apiVersion": 2 就连不上,VS Code 也不报具体错误,只卡在 “Connecting…”。
-
"request"必须为"attach"(不是"launch") -
"mode"必须为"remote"(不是"auto"或"exec") -
"port"和"host"要和dlv --listen=:2345完全一致,比如监听:2345,就配"port": 2345
远程服务器上 dlv 没真监听端口
连不上 ≠ 配置错,大概率是防火墙、SELinux 或 dlv 根本没起来。
- 远程执行
ss -tlnp | grep :2345,没输出说明dlv没成功监听 - 加
--log参数启动:dlv exec ./svc --headless --listen=:2345 --api-version=2 --log,查日志看是否因权限、缺少gcc或go工具链退出 -
dlv版本要匹配 Go:Go 1.21+ 至少用dlv@v1.22.0+,旧版可能卡在exec: "gcc": executable file not found
远程 GOPROXY/GOPRIVATE 没生效
VS Code Remote SSH 默认不加载 ~/.bashrc,go env 显示的 GOPROXY 可能为空,但终端里正常——这会导致 dlv 启动时模块拉取失败或超时。
- 检查
~/.bashrc是否有export GOPROXY=...,并确认remote.SSH.enableAgentForwarding设为true - 私有模块(如
git.internal.com/go/lib)必须在远程运行:go env -w GOPRIVATE=git.internal.com/go/* - 远程
go命令必须在$PATH中,且普通用户能执行,别用sudo dlv启动
最常被忽略的是:本地代码和远程二进制的调试信息必须完全对应——go build -gcflags="all=-N -l" 编译后,别再改代码、别用不同 commit 打包,否则符号表对不上,断点照样失效。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











