1. 程式人生 > 其它 >golang除錯工具Delve

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

 

 

  斷點執行了。然後除錯你的程式碼吧!