Go以及調試工具dlv安裝及使用


Go以及調試工具dlv安裝及使用

安裝go

wget https://studygolang.com/dl/golang/go1.14.1.linux-amd64.tar.gz

tar -C /usr/local -zxvf go1.14.1.linux-amd64.tar.gz

mkdir -p /home/go/bin/home/go/pkg /home/go/src  #官方建議工作目錄為/home/go

vi .bash_profile
#在最下面添加
export GOROOT=/usr/local/go
export GOPATH=/home/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
export GOPROXY="https://goproxy.io"
source .bash_profile

安裝Delve

# cd $GOPATH/src/
# git clone https://github.com/derekparker/delve.git
# cd delve/cmd/dlv/
# go build
# go install

命令介紹

Delve時Go程序的源代碼級的調試器。

Delve通過控制進程的執行、評估變量以及提供線程/ goroutine狀態、CPU寄存器狀態等信息,使你能夠與程序進行交互。

使用“--”將標志傳遞給正在調試的程序,例如:

`dlv exec ./hello -- server --config conf/config.toml`

Usage:
  dlv [command]

Available Commands:
  attach      連接到正在運行的進程並開始調試.
  connect     連接到無頭調試服務器.
  core        檢查核心轉儲.
  debug       編譯並開始調試當前目錄下的主包或指定的包.
  exec        執行預編譯的二進制文件,並開始調試會話.
  help        幫助信息
  run         棄用的命令。使用“debug”替代它.
  test        編譯測試二進制文件並開始調試程序.
  trace       編譯並開始跟蹤程序.
  version     打印版本.

Flags:
      --accept-multiclient   允許無頭服務器接受多個客戶機連接。注意,服務器API不是可重入的,客戶端必須協調.
      --api-version int      無頭時選擇API版本. (default 1)
      --backend string       后端選擇:
            default        在macOS上使用lldb,其他地方都是本地的.
            native        本地后端.
            lldb        使用lldb-server或debugserver.
            rr            使用mozilla rr (https://github.com/mozilla/rr).
         (default "default") 默認使用的是default
      --build-flags string   生成標志,以傳遞給編譯器.
      --headless             僅在headless模式下運行調試服務器.
      --init string          初始化文件,由終端客戶端執行.
  -l, --listen string        調試服務器監聽地址. (default "localhost:0")
      --log                  啟用調試服務器日志記錄.
      --log-output string    應該產生調試輸出的組件的逗號分隔列表,可能的值為:
            debugger    記錄調試器命令
            gdbwire        日志連接到gdbserial后端
            lldbout        將輸出從debugserver/lldb復制到標准輸出
            debuglineerr    讀取.debug_line時日志可恢復錯誤
            rpc            記錄所有RPC消息
            fncall        日志函數調用協議
            minidump    日志minidump加載
            使用--log啟用日志時,默認為“debugger”.
      --wd string            用於運行程序的工作目錄. (default ".")

使用"dlv [command] --help"獲取有關命令的詳細信息.

debug和attach使用的多一點

dlv debug

dlv debug test.go -- arg1 arg2

  • b(break) main.main:設置斷點,還可以根據行號設置斷點 b 9

  • bp:查找已經設置的斷點

  • c:該命令是讓程序運行起來,遇到設置的斷點會停止

    截屏2021-05-31 上午11.23.03

  • restart:重新開始下一輪的調試

  • n:下一步,不會陷入內部

  • s:進入某個函數的內部,源碼函數也跟蹤進去

  • so:如果用s陷入到內部函數,可以快速使用該命令跳出來,回到進入點

  • p [var_name]:打印變量的值

  • gr and grs:這兩個命令是用來查看goroutine的

  • help:使用過程中隨時通過help查看命令

    截屏2021-05-31 上午11.40.25

dlv attach

如果項目正在運行中,想要對正在運行的項目進行調試

1)首先使用"ps aux | grep 編譯文件名"來查看運行程序的進程號pid

2)然后就能夠使用"dlv attach pid"來連接該運行程序,然后就能使用之前debug中的命令來進行調試了

GoLand + Delve:遠程調試

前面的例子有使用Delve啟動應用或attach到應用進行調試,但添加斷點,運行到下一步,查看變量值等操作都是在終端中,輸入delve命令來進行的。這種調試方式也太古老了,效率低下。真實場景下,幾乎不會使用這種方式來進行調試。我們還是希望借助IDE進行更高效的調試。 下面就介紹如何在GoLand中配合delve進行調試。包括附加到進程調試和遠程調試。其實附加到本地進程和遠程調試原理是一樣的,待調試的進程是通過delve啟動的,delve會啟動進程,並立即附加到進程,開啟一個debug session。並且啟動一個debug server,暴露某個端口,客戶端IDE可以通過該端口連接到debug server進行調試。

遠程調試Debug優點

  1. 極大的加快開發速度,減少給在代碼中使用大量log來定位錯誤(開發效率太低)
  2. 最大程度的使用linux遠程服務器環境, 極大的簡化本地部署模擬服務器環境
  3. 可以繞過數據庫內網的限制
  4. 完美的解決一些不支持windows開發的依賴

步驟

  1. 在服務器上運行delve server,可以是用delve運行go代碼,也可以是運行可執行程序,也可以是侵入一個運行中的go程序,一般來說attach一個運行中的go程序比較常見。
    上述的三種方式:debug, exec, attach 都支持從遠程操控,只需為 dlv 命令加上下述參數:

--listen=:2345 --headless=true --api-version=2 --accept-multiclient

dlv attach $PID --headless --api-version=2 --log --listen=:1234

這樣delve server就起來了,然后 繼續下一步就是Goland連接調試

  1. 直接在Goland中配置Host和Port即可

  1. 然后在本地設置完端點后,在源代碼中選擇這個“Go Remote”調試器進行調試


免責聲明!

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



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