Delve是Go语言官方维护的原生调试器,针对Go语法和运行时特性优化,是Debian下调试Go程序的首选工具。
go get
命令安装最新版本:go get -u github.com/go-delve/delve/cmd/dlv
dlv debug ./main.go
(进入交互式命令行);break main.go:10
(在指定行号设置断点);continue
(继续运行至下一个断点)、next
(执行下一行,不进入函数)、step
(进入函数内部);print variable_name
(查看变量值)、set variable_name = new_value
(修改变量值);stack
(显示当前调用堆栈)。GDB是Linux系统下的通用调试器,虽非专为Go设计,但可通过编译时添加调试信息支持Go程序调试。
sudo apt-get install gdb
-gcflags "-N -l"
禁用优化和内联(保留调试信息):go build -gcflags "-N -l" -o debug-demo debug-demo.go
gdb ./debug-demo
;break main.main
(设置断点)、run
(启动程序)、next
(单步执行)、print variable_name
(查看变量)。通过VS Code或Goland等IDE,可实现图形化调试,提升效率。
launch.json
配置文件(位于.vscode
目录):{
"version": "0.2.0",
"configurations": [
{
"name": "Launch",
"type": "go",
"request": "launch",
"mode": "auto",
"program": "${workspaceFolder}",
"env": {},
"args": []
}
]
}
F5
键,或点击调试工具栏的“开始调试”按钮,支持断点、变量查看、单步执行等可视化操作。pprof是Go内置的性能分析工具,可帮助定位CPU、内存瓶颈及goroutine泄漏等问题。
net/http/pprof
并启动HTTP服务:import _ "net/http/pprof"
func main() {
go func() { log.Println(http.ListenAndServe("localhost:6060", nil)) }()
// 程序逻辑
}
go tool pprof http://localhost:6060/debug/pprof/profile?seconds=30
http://localhost:6060/debug/pprof/heap
获取内存快照;top
、list
等命令查看内存占用最高的函数。通过日志输出程序执行流程和变量状态,是简单有效的调试手段。
import (
"log"
"os"
)
func main() {
log.SetOutput(os.Stdout) // 输出到标准输出
log.Println("程序启动") // 打印日志
// 程序逻辑
}
编写单元测试可快速验证代码逻辑的正确性,避免引入外部依赖。
testing
包编写测试函数(以Test
开头):import "testing"
func TestAdd(t *testing.T) {
result := Add(1, 2)
if result != 3 {
t.Errorf("Add(1, 2) = %d, want 3", result)
}
}
go test -v ./... # 运行当前目录及子目录的所有测试
-run
参数指定测试函数(如go test -v -run TestAdd
),或在测试代码中设置断点,通过Delve或IDE调试测试过程。编译时添加调试信息,可提升调试工具的效果。
-gcflags="-N -l"
编译,保留变量名、行号等调试信息:go build -gcflags="-N -l" -o debug-binary main.go
go tool nm
查看二进制文件的符号表(如函数名、变量名),辅助调试:go tool nm ./debug-binary
go tool objdump
反汇编二进制文件,查看底层指令:go tool objdump ./debug-binary
以上技巧覆盖了Debian下调试Go程序的常用场景,可根据具体需求选择合适的工具(如Delve用于交互式调试、pprof用于性能分析、IDE用于可视化操作),结合日志记录和单元测试,能快速定位和解决代码问题。