golang除錯工具Delve
Devle是一個非常棒的golang 除錯工具,支援多種除錯方式,直接執行除錯,或者attach到一個正在執行中的golang程式,進行除錯。
線上golang服務出現問題時,Devle是必不少的線上除錯工具,如果使用docker,也可以把Devle打進docker映象裡,除錯程式碼。
安裝Devle
安裝Devle非常簡單,直接執行go get 即可:
go get -u github.com/derekparker/delve/cmd/dlv
如果你的go版本為1.5請先設定環境變數GO15VENDOREXPERIMENT=1再執行go get。我的go版本為1.10,不用設定。
使用Devle除錯golang服務
先寫一個簡單的web服務,然後使用Devle來進行除錯。
在$GOPATH/src/github.com/mytest 資料夾下建立main.go
1 package main 2 3 import ( 4 "fmt" 5 "log" 6 "net/http" 7 "os" 8 ) 9 10 const port = "8000" 11 12 func main() { 13 http.HandleFunc("/hi", hi) 14 15 fmt.Println("runing on port: " + port) 16 log.Fatal(http.ListenAndServe(":" + port, nil)) 17 } 18 19 func hi(w http.ResponseWriter, r *http.Request) { 20 hostName, _ := os.Hostname() 21 fmt.Fprintf(w, "HostName: %s", hostName) 22 }
簡單吧,一個執行在8000埠上的web服務,訪問 hi會返回機器的名稱。上面程式碼的行號是很有用的,等會我們打斷點的時候會用到。
使用Delve執行我們的main.go
dlv debug ./main.go
可以輸入help來看一下幫助文件
很簡單的一些命令
我們先打在main方法上打一個斷點:
b main.main
然後執行c 來執行到斷點,
在func li 裡打一個斷點,我們可以使用
b main.hi
或者使用 "檔案:行號"來打斷點
b /home/goworkspace/src/github.com/mytest/main.go:20
現在執行continue 讓服務跑起來。訪問一下我們的服務,看hi方法會不會停下來。
curl localhost:8000/hi
看到了沒,在19號停下來了。
輸入 n 回車,執行到下一行
輸入s 回車,單步執行
輸入 print(別名p)輸出變數資訊
輸入 args 打印出所有的方法引數資訊
輸入 locals 列印所有的本地變數
其他的命令我就不在這裡給大家演示了,自己動動手試一下。
使用Delve附加到執行的golang服務進行除錯
先編譯一下我們的main.go然後去行main
go build main.go ./main
然後使用Delve附加到我們的專案上,先看一下我們的專案的pid
ps aux|grep main
dlv attach 29260
在hi方法裡打斷點,然後執行c來等待斷點的執行。
b /home/goworkspace/src/github.com/mytest/main.go:20
訪問我們的伺服器,看一下斷點會不會被執行
curl localhost:8000/hi
斷點執行了。然後除錯你的程式碼吧!