Devle是一個很是棒的golang 調試工具,支持多種調試方式,直接運行調試,或者attach到一個正在運行中的golang程序,進行調試。html
線上golang服務出現問題時,Devle是必很多的在線調試工具,若是使用docker,也能夠把Devle打進docker鏡像裏,調試代碼。git
安裝Devle很是簡單,直接運行go get
便可:github
go get -u github.com/derekparker/delve/cmd/dlvgolang
若是你的go版本爲1.5請先設置環境變量GO15VENDOREXPERIMENT=1再運行go get。個人go版本爲1.10,不用設置。web
先寫一個簡單的web服務,而後使用Devle來進行調試。docker
在$GOPATH/src/github.com/mytest 文件夾下建立main.go服務器
package main import ( "fmt" "log" "net/http" "os" ) const port = "8000" func main() { http.HandleFunc("/hi", hi) fmt.Println("runing on port: " + port) log.Fatal(http.ListenAndServe(":" + port, nil)) } func hi(w http.ResponseWriter, r *http.Request) { hostName, _ := os.Hostname() fmt.Fprintf(w, "HostName: %s", hostName) }
簡單吧,一個運行在8000端口上的web服務,訪問 hi會返回機器的名稱。上面代碼的行號是頗有用的,等會咱們打斷點的時候會用到。curl
使用Delve運行咱們的main.goide
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 打印出全部的方法參數信息
其餘的命令我就不在這裏給你們演示了,本身動動手試一下。
使用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
斷點執行了。而後調試你的代碼吧!