GO語言調試利器dlv快速上手


一、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將會看到幫助信息:

image

上面的信息只是列出了命令列表,具體使用方法沒有給出,我們可以執行dlv help + 具體命令來查看詳細說明,

比如我們執行dlv help attach:

image

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

image

2)r(restart):重啟當前進程

類似gdb里的run,如果剛執行dlv debug hello.go,進程已經起來,不用執行。如果進程已結算或需要重新開始則需要執行r

3)c(continue):繼續執行到斷點處

image

4)bp:查看所有斷點

image

5)on  :當運行到某斷點時執行相應命令

斷點可以是名稱(在設置斷點時可命名斷點)或者編號,例如on 3 p i表示運行到斷點3時打印變量i。

image

6)cond(condition)   :有條件的斷點

針對某個斷點,只有表達式成立才會被中斷。例:

condition 3 i==1

image

image

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:顯示所有協程

image

2)goroutine:協程切換

先執行goroutine 7表示切換到7號協程上

3.4 其他命令

1)frame:切換棧。

2)regs:打印寄存器內容。

3)sources:打印所有源代碼文件路徑

4)source:執行一個含有dlv命令的文件

source命令允許將dlv命令放在一個文件中,然后逐行執行文件內的命令。

5)trace:類似於打斷點,但不會中斷,同時會輸出一行提示信息


免責聲明!

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



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