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
如果項目正在運行中,想要對正在運行的項目進行調試
-
首先使用 "ps aux | grep 編譯文件名" 來查看運行程序的進程號 pid
-
然後就能夠使用 "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 程序比較常見
dlv attach $PID --headless --api-version=2 --log --listen=:1234
這樣 delve server 就起來了,然後 繼續下一步就是 Goland 連接調試
-
直接在 Goland 中配置 Host 和 Port 即可,然後在源代碼中選擇這個 “Go Remote” 調試器進行調試
本文作者:尹瑞星
本文鏈接:https://www.cnblogs.com/yrxing/p/14830827.html
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://www.cnblogs.com/yrxing/p/14830827.html