在編寫 Go 代碼的時候,因為很多時候都是需要調試服務器上的代碼的,作為一個年長的工程師,肯定不能用 log.Printf
來調試問題,所以我選擇了 delve 這個工具,通過 delve 我可以像本地調試代碼一樣在 Goland 中調試 Go 代碼,很是愜意。如果要說缺點的話,那就是在服務端啟動 delve 的 server 端之后,必須在一定時間內(不知道具體多久)連接上它,不然會關閉;同時,在我斷開調試之后,server 會自動關閉,如果我要再次調試,那就必須再運行一次 server(當然,可以通過不關閉 debug 解決,就是不太友好)。
具體使用 delve 調試還是比較簡單的,只需要兩步:
第一步:在服務器上運行 delve 服務器
運行 delve 服務器有幾種形式,可以是用 delve 運行 Go 代碼,也可以是運行可執行程序,也可以是侵入一個運行中的 Go 程序,一般來說,attach 一個運行中的 Go 程序比較常見:
[root@liqiang.io] dlv attach $PID --headless --api-version=2 --log --listen=:1234
這樣 delve 服務器就起來了,然后繼續下一步就是 Goland 連接調試。
第二步:在 Goland 中連接 delve 服務器
直接在 Goland 中配置 Host 和 Port 即可,然后在源代碼中選擇這個 “Go Remote” 調試器進行調試:
注意點:
- Go 代碼需要加上編譯選項:
-gcflags='all=-N -l'
,這個 Goland 也會提示你; - 不一定要用 Goland 調試,你也可以在本地執行
delve connect
來連接調試。
有時候我么需要遠程調試golang程序,比如我們在macos寫的代碼,但是有時在linux上運行的,所以我們需要遠程調試運行在linux系統的代碼。另外一種情況是我們可以把goalng打包到docker 鏡像中,代碼跑在容器中同樣可以調試。以goland為例。
remote debug
遠程調試golang代碼需要在運行代碼的遠程機器上按照delve,然后以delve運行要調試的程序。
- 編譯
export CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -gcflags='all -N -l' main.go
- install delve
go get go get -u github.com/derekparker/delve/cmd/dlv
- delve 運行程序
dlv --listen=:2345 --headless=true --api-version=2 exec ./main
-
goland 設置remote debug
host為遠程主機ip 端口是剛才dlv設置的端口
屏幕快照 2018-07-03 下午3.57.11.png - debug
然后就像調試本地代碼一樣調試遠程主機上的程序