一、dlv的安裝
1)下載dlv
git clone https://github.com/go-delve/delve.git $GOPATH/src/github.com/go-delve/delve
或者 go get github.com/derekparker/delve/cmd/dlv
2)安裝
cd $GOPATH/src/github.com/go-delve/delve
make install
二、dlv簡要使用說明
2.1、獲取幫助信息
安裝后執行dlv -h將會看到幫助信息:
上面的信息只是列出了命令列表,具體使用方法沒有給出,我們可以執行dlv help + 具體命令來查看詳細說明,
比如我們執行dlv help attach:
2.2、進入調試模式
1)dlv attach pid:類似與gdb attach pid,可以對正在運行的進程直接進行調試(pid為進程號)。
2)dlv debug:運行dlv debug test.go會先編譯go源文件,同時執行attach命令進入調試模式,該命令會在當前目錄下生成一個名為debug的可執行二進制文件,退出調試模式會自動被刪除。
3)dlv exec executable_file :直接從二進制文件啟動調試模式。如果要帶參數執行需要添加--,如dlv exec executable_file -- -f xxx.conf
4)dlv core executable_file core_file:以core文件啟動調試,通常進行dlv的目的就是為了找出可執行文件core的原因,通過core文件可直接找出具體進程異常的信息。
3、常用調試方法
3.1 dlv trace追蹤調用軌跡
該命令最直接的用途是可以追蹤代碼里函數的調用軌跡,
如下源代碼,現用trace命令跟蹤其調軌跡。
package main import ( "fmt" "time" ) func Test() { fmt.Println("hello") time.Sleep(1000 * 1000 * 100) } func Test2() { fmt.Println("world") time.Sleep(1000 * 1000 * 100) } func main() { for i := 0; i < 2; i++ { go Test() go Test2() } time.Sleep(1000 * 1000 * 2000) fmt.Println("end") }
運行結果,這里看除了Test,test2也被追蹤:
$ dlv trace hello.go Test
> goroutine(19): main.Test2()
> goroutine(21): main.Test2()
> goroutine(18): main.Test()
world
hello
world
> goroutine(20): main.Test()
hello
=> ()
=> ()
=> ()
=> ()
end
3.2 調試模式基本命令
這里用上節的源碼作為示例進行調試。開始調試:dlv debug hello.go
1)b(break):打斷點
設置斷點,當需要設置多個斷點時,為了斷點可識別可進行自定義命名。進入調試模式后先打斷點。
例:b Test
b test.go:13
2)r(restart):重啟當前進程
類似gdb里的run,如果剛執行dlv debug hello.go,進程已經起來,不用執行。如果進程已結算或需要重新開始則需要執行r
3)c(continue):繼續執行到斷點處
4)bp:查看所有斷點
5)on :當運行到某斷點時執行相應命令
斷點可以是名稱(在設置斷點時可命名斷點)或者編號,例如on 3 p i表示運行到斷點3時打印變量i。
6)cond(condition) :有條件的斷點
針對某個斷點,只有表達式成立才會被中斷。例:
condition 3 i==1
7)n(next):逐行執行代碼,不進入函數內
8)s(step):逐行執行代碼,遇到函數會跳進內部
9)stepout:當使用s命令進入某個函數后,執行它可跳出函數
10)si(step-instruction):單步單核執行代碼
如果不希望多協程並發執行可以使用該命令,這在多協程調試時極為方便。
11)args:查看被調用函數所傳入的參數值
12)locals:查看所有局部變量
locals var_name:查看具體某個變量,var_name可以是正則表達式。
13)clear:清除單個斷點
14)clearall:清除所有斷點
15)list:打印當前斷點位置的源代碼
list后面加行號可以展示該行附近的源代碼,要注意該行必須是代碼行而不能是空行。
16)bt:打印當前棧信息。
3.3 多協程調試
1)goroutines:顯示所有協程
2)goroutine:協程切換
先執行goroutine 7表示切換到7號協程上
3.4 其他命令
1)frame:切換棧。
2)regs:打印寄存器內容。
3)sources:打印所有源代碼文件路徑
4)source:執行一個含有dlv命令的文件
source命令允許將dlv命令放在一個文件中,然后逐行執行文件內的命令。
5)trace:類似於打斷點,但不會中斷,同時會輸出一行提示信息