這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
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 斷行符號,逐步執行,
輸入 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
斷點執行了。然後調試你的代碼吧!