下面按常见场景给你一份 Go 在 Linux 下的调试配置指南,从最常用到进阶,你可以按需取用。
go version
推荐 Go 1.20+
调试时务必加:
go build -gcflags="all=-N -l"
-N:禁用优化-l:禁用内联或运行:
go run -gcflags="all=-N -l" main.go
go install github.com/go-delve/delve/cmd/dlv@latest
确认:
dlv version
dlv debug main.go
常用命令:
b main.main # 打断点
b 文件名:行号
c # 继续
n # 单步
s # 步入
p 变量名 # 打印变量
bt # 调用栈
dlv exec ./app
dlv attach <pid>
查看 pid:
ps aux | grep app
{
"version": "0.2.0",
"configurations": [
{
"name": "Launch",
"type": "go",
"request": "launch",
"mode": "debug",
"program": "${workspaceFolder}",
"args": [],
"env": {},
"buildFlags": "-gcflags=all=-N -l"
}
]
}
在服务器:
dlv debug --headless --listen=:2345 --api-version=2
本地 VS Code:
{
"name": "Remote",
"type": "go",
"request": "attach",
"mode": "remote",
"remotePath": "/path/to/project",
"port": 2345,
"host": "服务器IP"
}
GOTRACEBACK=all ./app
import "runtime/debug"
debug.PrintStack()
| 问题 | 解决 |
|---|---|
| 断点不生效 | 没加 -N -l |
| attach 失败 | dlv 需同用户或 root |
| 容器里调试 | 需 SYS_PTRACE 权限 |
| CGO 程序 | 用 dlv exec 更稳定 |
RUN go install github.com/go-delve/delve/cmd/dlv@latest
CMD ["dlv", "exec", "./app", "--headless", "--listen=:2345"]
运行容器:
docker run --cap-add=SYS_PTRACE -p 2345:2345 app
如果你愿意,可以告诉我:
我可以直接给你一套可复制的配置。