在 Ubuntu 环境里给 Go 程序排查问题,很多人会先问两个问题:该选哪个调试器,和装好之后到底怎么用。答案通常都指向 Delve,因为它和 Go 工具链贴得最近,既能处理 goroutine、堆栈、变量查看这些核心场景,也能兼顾命令行和 IDE 两种工作流。
下面按“为什么选、如何安装、如何进入调试、图形界面怎么接入”的顺序梳理一遍。看完后,你可以判断 Delve 是否适合自己的项目场景,也能直接照着命令把 Ubuntu 上的 Go 调试环境跑起来。
为什么在 Ubuntu 上优先选 Delve
如果目标是在 Ubuntu 上稳定调试 Golang 程序,Delve 基本是默认答案,原因主要有四点。
官方维护,跟 Go 版本同步更稳
Delve 由 Go 语言团队维护,和 Go 工具链集成紧密,兼容最新 Go 版本(如 1.21+)。对日常开发来说,这意味着在升级 Go 版本后,调试链路通常更可靠,踩兼容性坑的概率也更低。
Go 语言关键特性支持更完整
它不是通用调试器对 Go 的“兼容”,而是面向 Go 本身设计的工具。像 goroutine、接口、反射、堆栈跟踪、变量检查、断点控制这些能力,Delve 都有比较完整的支持,适合真实开发中的主流排障需求。

命令行和图形界面都能用
Delve 既可以直接在终端里使用,也能接入 VSCode、GoLand 等图形化工具。新手可以先从几条基础命令入门,熟悉后再迁移到 IDE 提升效率,不需要换一套调试体系。

在大型项目里更容易保持可用性
Delve 对 Go 语言的调试链路做过针对性优化。原文提到,它在调试过程中不会明显拖慢程序运行,这一点在大型项目或复杂调用链里尤其重要。
Ubuntu 安装 Delve 的步骤
安装前先确认 Go 环境已经就绪,建议使用 Go 1.16 以上版本。完成后,可以直接用下面的命令安装 Delve:
# 使用Go模块安装(推荐,避免权限问题)
go install github.com/go-delve/delve/cmd/dlv@latest
# 将Delve添加到PATH(若未自动添加)
echo 'export PATH=$PATH:$(go env GOPATH)/bin' >> ~/.bashrc
source ~/.bashrc
安装完成后,用下面这条命令确认是否可用:
dlv version
如果终端能正常输出版本号,说明 Delve 已经安装成功并可直接调用。
Delve 的基本调试流程
实际使用时,可以把 Delve 的流程理解成三步:先编译出适合调试的程序,再启动调试会话,最后配合常用命令定位问题。
先关闭优化和内联,保证调试信息准确
调试前建议重新编译程序,并显式关闭优化与内联:
go build -gcflags "all=-N -l" -o myprogram main.go
这里的 -gcflags "all=-N -l" 是关键:
-N:禁用优化-l:禁用内联
少了这一步,变量值、断点位置或调用栈信息都可能出现偏差,调试体验会明显变差。
根据场景选择 debug 或 exec
如果你还在开发阶段,通常直接调试源码即可:
dlv debug main.go
如果程序已经编译完成,或者你要针对现成二进制排查问题,则使用:
dlv exec ./myprogram
前者更适合日常开发迭代,后者更适合测试环境或接近生产环境的排查场景。
最常用的一组调试命令
| 命令 | 缩写 | 功能说明 |
|---|---|---|
break/b | b | 设置断点(如 b main.go:10 在 10 行设置断点) |
continue/c | c | 继续执行程序,直到下一个断点或程序结束 |
next/n | n | 单步执行,跳过函数调用,不进入函数内部 |
step/s | s | 单步执行,进入函数内部 |
print/p | p | 打印变量值(如 p user.Name 打印 user 结构体的 Name 字段) |
locals | - | 显示当前栈帧的所有局部变量 |
args | - | 显示当前栈帧的所有参数 |
goroutines | - | 显示所有 goroutine 的状态 |
stack/bt | - | 显示当前 goroutine 的堆栈跟踪 |
quit/q | q | 退出调试器 |
如果只是处理常见 bug,这一组命令通常已经够用。尤其是 break、continue、next、step 和 print,基本覆盖了大多数单步排查流程。
需要时再用附加调试和远程调试
除了本地直接启动程序,Delve 还支持两类更进阶的场景。
附加到运行中的进程:
dlv attach <PID>
其中 <PID> 是目标进程 ID,可以通过下面的命令获取:
ps aux | grep myprogram
远程调试:
dlv debug --headless
这一模式适合在远程服务器或需要网络接入的环境里使用,但前提是你已经准备好了相应的调试连接配置。
接入 VSCode 和 GoLand,会比纯命令行更高效吗
如果你已经熟悉命令行,Delve 本身足够完成大多数调试任务;但如果希望把断点、变量监视、调用栈查看放进 IDE 里,图形化集成通常更省时间。
VSCode:通过 Go 扩展启动 Delve
在 VSCode 中安装 Go 扩展后,创建 launch.json,并配置以下关键字段:
"type": "go", "request": "launch", "mode": "debug"
之后就可以直接通过调试按钮启动 Delve,使用可视化断点、变量监视和调用栈查看等能力。
GoLand:内置支持,开箱即用
GoLand 已经内置 Delve 支持,通常不需要额外配置。直接以“Debug”模式启动程序,就可以使用条件断点、表达式求值和更强的代码导航能力。对于长期维护 Go 项目的开发者来说,这种工作流往往更顺手。
除了 Delve,还有没有别的选择
有,但在 Go 场景下通常不是首选。
例如 GDB 作为传统 C/C++ 调试器,也可以通过 -go-delve 插件支持 Go;不过它对 Go 的支持深度不如 Delve,像 goroutine 调试这类能力就不完整。简单场景可以临时使用,但如果目标是日常开发和稳定排障,Delve 仍然是更专业的方案。
怎么做选择更实际
如果你在 Ubuntu 上调试 Golang 程序,优先掌握 Delve 基本不会错。它兼顾了官方维护、Go 特性支持、命令行可用性和 IDE 集成能力,覆盖范围足够广。
比较实用的路径是:先把 go install、go build -gcflags "all=-N -l"、dlv debug 和几条核心命令用熟,再根据团队习惯接入 VSCode 或 GoLand。这样既能保证排障能力,也不会把调试流程搞得过重。









