Linux系统下Go语言调试技巧
Delve是Go语言官方推荐的调试工具,深度支持Go特性(如goroutine、channel等),是Linux下调试Go程序的首选。
go install命令安装最新版,确保$GOPATH/bin在$PATH环境变量中(方便全局调用):go install github.com/go-delve/delve/cmd/dlv@latest
-gcflags "-N -l"禁用编译器优化和内联,保留完整的调试信息(否则断点可能无法准确定位):go build -gcflags "-N -l" -o myprogram main.go
dlv debug ./myprogram(进入命令行模式)或dlv debug ./myprogram --headless --listen=:2345(启动远程调试服务);break(或缩写b)指定文件名和行号(如break main.go:10)或函数名(如break main.main);continue(继续运行至下一个断点)、next(执行下一行,跳过函数内部)、step(进入函数内部);print(或p)打印变量值(如print a),set修改变量值(如set a 100);stack(或bt)显示当前goroutine的调用栈,帮助定位问题发生的函数路径。log包在关键节点添加日志(如函数入口、错误处理处),记录程序执行流程和变量状态(如log.Printf("Received request: %s", req.URL.Path))。日志是快速定位问题的“轻量级工具”,尤其适合生产环境。(result, error)时,务必检查error返回值(如if err != nil { log.Fatal(err) });使用errors.Is(判断错误是否为指定类型)和errors.As(提取错误的具体类型)精准处理错误;通过defer确保资源(如文件、数据库连接)释放;在错误信息中添加上下文(如fmt.Errorf("failed to open file: %w", err)),避免“错误信息不明确”的问题。defer和recover捕获运行时panic(如defer func() { if r := recover(); r != nil { log.Printf("Recovered from panic: %v", r) } }()),防止程序崩溃,并记录panic信息以便排查问题。net/http/pprof(无需修改业务逻辑,自动注册性能分析接口);go func() { log.Println(http.ListenAndServe("localhost:6060", nil)) }());curl下载分析文件(如curl http://localhost:6060/debug/pprof/profile?seconds=30 > cpu.pprof收集30秒CPU数据);go tool pprof命令分析(如go tool pprof cpu.pprof),通过top(查看占用最高的函数)、list(查看具体函数的耗时代码)、web(生成调用关系图)等命令定位性能问题。File → Settings → Go);