golang remote debug和docker debug


在編寫 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
    然后就像調試本地代碼一樣調試遠程主機上的程序

docker debug


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM