调试 Go 代码,尤其是在 Debian 系统环境中,可选方法其实很多。但真正高效、稳定、适合日常开发排查问题的工具,核心也就是这几种。
下面直接从最值得优先使用的方案讲起,带你快速了解在 Debian 上进行 Golang 代码调试时,实际开发场景中应该怎么选择和使用。

1. 用 Delve 调试——这是 Go 的标配工具
Delve 是 Go 语言官方生态里最常用的原生调试器,也可以说是目前调试 Golang 程序最顺手的选择。断点、单步执行、变量查看这些基础能力自然都支持,更关键的是它对 Go 协程、运行时和调用栈的理解非常到位,这一点是传统 GDB 很难完全胜任的。
安装 Delve
在终端中执行下面这条命令即可完成安装:
go install github.com/go-delve/delve/cmd/dlv@latest
安装完成后,别忘了把 $HOME/go/bin 加入到 PATH 环境变量中,否则直接输入 dlv 时通常会提示命令不存在:
echo 'export PATH=$PATH:$HOME/go/bin' >> ~/.bashrc
source ~/.bashrc
启动调试
进入你的 Go 项目目录后,直接使用 dlv debug 启动调试即可。假设入口文件是 main.go:
dlv debug main.go
执行后会进入交互式命令行调试界面,接下来就可以通过命令控制程序运行、设置断点以及查看变量信息。
常用命令一览
设置断点:
break main.go:10 # 在第10行设置断点
break main.main # 在main函数入口设置断点
控制执行:
continue # 继续执行到下一个断点
next # 单步执行,不进入函数内部
step # 单步执行,会进入函数内部
finish # 执行完当前函数并返回
查看信息:
print variableName # 查看变量值
list # 显示当前源码
bt # 查看调用堆栈
退出调试:直接输入 quit 或按 Ctrl+C 即可。
远程调试场景
如果你需要调试远程运行的 Go 服务,Delve 同样支持 headless 无界面模式,只需要在启动时监听一个端口:
dlv debug --headless --listen=:2345 --api-version=2
随后在本地 IDE(例如 VSCode)中配置远程连接,指向 localhost:2345,就可以完成远程调试。这种方式在排查 Debian 服务器上的 Golang 服务问题时尤其常见。
2. 用 VSCode 做图形化调试
如果你更习惯图形界面调试,那么 VSCode 配合 Go 插件,是目前非常成熟且上手门槛较低的方案。
准备工作
先安装 VSCode,然后在扩展市场中搜索“Go”并安装对应插件,建议选择 Microsoft 官方发布的版本。
配置调试文件
- 打开 Go 项目文件夹,点击左侧的调试图标(虫子图标)。
- 点击顶部“创建 launch.json 文件”,环境选择“Go”。
- VSCode 会自动生成一个
.vscode/launch.json,可以按下面这个模板进行调整:
{
"version": "0.2.0",
"configurations": [
{
"name": "Launch",
"type": "go",
"request": "launch",
"mode": "debug",
"program": "${workspaceFolder}",
"env": {},
"args": []
}
]
}
启动调试
- 在代码编辑区点击行号左侧空白位置,设置红点断点。
- 按
F5,或者点击调试面板中的绿色运行按钮,即可启动调试。 - 顶部调试工具栏可以完成继续执行、单步跳过、单步进入等操作,同时还能实时查看变量、监视表达式和调用堆栈。
3. GDB——备选方案,能用但没那么顺手
GDB 是 Linux 平台常见的通用调试器。虽然它并不是专门为 Go 语言设计的,但在 Debian 上如果配合合适的编译参数,依然可以用于基础的 Golang 程序调试。
安装
在 Debian 系统中的安装方式非常直接:
sudo apt-get install gdb
编译时添加调试信息
构建 Go 程序时,建议通过 -gcflags 关闭优化和内联,否则使用 GDB 调试时可能出现跳行不准、变量信息异常等问题:
go build -gcflags "-N -l" -o debug-demo main.go
其中 -N 表示禁用优化,-l 表示禁用内联,这样 GDB 才能更准确地映射源码位置。
进入调试
gdb ./debug-demo
设置断点:
break main.main # 在main函数入口设断点
break main.go:10 # 在指定行设断点
控制执行:
run # 开始执行
next # 单步执行(不进入函数)
step # 单步执行(进入函数)
continue # 继续执行到下一个断点
查看信息:
print variableName # 查看变量值
backtrace # 查看调用堆栈
info locals # 查看所有局部变量
退出时使用 quit。不过实话实说,如果开发环境允许,还是更推荐优先使用 Delve。因为 GDB 对 Go 协程、垃圾回收和运行时细节的支持相对有限,实际调试过程中偶尔会遇到不够直观甚至踩坑的情况。
4. 日志和单元测试——看似朴素,但往往最管用
除了专门的调试器之外,日志输出和单元测试也是 Debian 上排查 Go 程序问题时非常实用的辅助方式,而且在很多真实项目中,它们的效率往往比手动断点调试更高。
日志输出
Go 标准库中的 log 包已经足够应对大多数场景,当然你也可以根据项目需要使用 logrus 这类第三方日志库:
package main
import (
"log"
"os"
)
func main() {
log.SetOutput(os.Stdout)
log.Println("程序启动")
// 程序逻辑...
}
日志最大的价值在于:它可以在不打断程序执行流程的前提下,完整保留上下文信息、执行路径和关键变量状态,而这一点往往是调试器难以长期替代的。
单元测试
通过 testing 包,你可以为核心业务逻辑编写测试用例,直接验证函数行为是否符合预期,这对于定位 Go 代码错误非常高效:
package main
import "testing"
func Add(a, b int) int {
return a + b
}
func TestAdd(t *testing.T) {
result := Add(2, 3)
if result != 5 {
t.Errorf("Add(2, 3) = %d; want 5", result)
}
}
运行测试:
go test -v
当测试失败时,输出结果通常就是最直接的问题定位线索。很多有经验的 Go 开发者都会建议:先把日志体系和测试用例建立好,再借助 Delve 或 VSCode 去追踪复杂疑难问题,这通常才是在 Debian 上调试 Golang 项目的高效组合。
