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
);