轉自:http://www.cnblogs.com/li-peng/p/8522592.html
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
斷點執行了。然后調試你的代碼吧!
=========================================================================================
遠程調試
在服務器上 ps x|grep game 查找到gameserver的進程pid
然后服務器命令行輸入:dlv attach $PID --headless --api-version=2 --log --listen=:8181
本機只要輸入:
dlv connect remote_ip:8181
連接到服務器上的dlv進程,就可以在本機遠程調試了。
goland調試=========================================================================================
dlv停止調試可以用ctrl+|