在 Ubuntu 上调试 Go 代码的高效方法
一、准备环境
二、使用 Delve 命令行调试
# 进入调试会话
dlv debug
# 设置断点
(dlv) break main.main
(dlv) break main.go:20
# 运行
(dlv) continue
# 单步与打印
(dlv) next
(dlv) print sum
# 退出
(dlv) quit
三、使用 VS Code 图形化调试
{
"version": "0.2.0",
"configurations": [
{
"name": "Launch Package",
"type": "go",
"request": "launch",
"mode": "auto",
"program": "${workspaceFolder}"
}
]
}
四、进阶与常见问题
编译优化导致变量不可见
调试时请关闭编译器优化与内联,保证断点与源码位置一致、变量可打印:
{
"version": "2.0.0",
"tasks": [
{
"type": "shell",
"label": "go_build_debug",
"command": "go",
"args": [
"build",
"-gcflags", "all=-N -l",
"-o", "${workspaceFolder}/app_debug",
"${workspaceFolder}/main.go"
]
}
]
}
在 launch.json 中使用 mode: exec 并指定 program 为编译产物,配合 preLaunchTask 执行构建。附加到已运行进程失败(ptrace 限制)
在部分 Ubuntu 上,普通用户默认不能 ptrace 附加进程。可修改内核参数:
# 临时放宽(重启失效)
echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
# 永久生效(写入配置并重启)
echo "kernel.yama.ptrace_scope = 0" | sudo tee /etc/sysctl.d/10-ptrace.conf
sudo sysctl -p /etc/sysctl.d/10-ptrace.conf
注意:放宽 ptrace 可能带来安全风险,仅在可信环境下使用。
性能问题定位(pprof)
对于 CPU/内存瓶颈,可使用 net/http/pprof: