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:該命令是讓程序運行起來,遇到設置的斷點會停止
-
restart:重新開始下一輪的調試
-
n:下一步,不會陷入內部
-
s:進入某個函數的內部,源碼函數也跟蹤進去
-
so:如果用s陷入到內部函數,可以快速使用該命令跳出來,回到進入點
-
p [var_name]:打印變量的值
-
gr and grs:這兩個命令是用來查看goroutine的
-
help:使用過程中隨時通過help查看命令
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優點
- 極大的加快開發速度,減少給在代碼中使用大量log來定位錯誤(開發效率太低)
- 最大程度的使用linux遠程服務器環境, 極大的簡化本地部署模擬服務器環境
- 可以繞過數據庫內網的限制
- 完美的解決一些不支持windows開發的依賴
步驟
- 在服務器上運行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連接調試
- 直接在Goland中配置Host和Port即可
- 然后在本地設置完端點后,在源代碼中選擇這個“Go Remote”調試器進行調試