go調(diào)試利器-delve

大家好,我是小棧君,好久沒更新文章了,確實抱歉!因為工作變動等原因?qū)е伦罱细鼑乐?,但是請大家放心,我會一如既往的為大家?guī)碜约旱脑瓌?chuàng)文章,供大家相互交流和學(xué)習(xí),一起成長。今天小棧君帶來的分享是go語言的調(diào)試利器DELVE。

關(guān)于delve工具的介紹,這里簡單給大家介紹一下。delve在go項目及應(yīng)用的開發(fā)中可以用來追蹤程序中的異常代碼,也可以通過打日志的方式追查問題,但是更重要也是非常厲害的一點,就是delve可以直接分析程序執(zhí)行的情況。這一點在后期或線上的問題排查中無疑是提供了一個非常大的便捷。

我們可以登陸官網(wǎng)上進行查看 -- https://github.com/go-delve/delve --
[圖片上傳失敗...(image-4cbbf5-1593445503271)]
[圖片上傳失敗...(image-549464-1593445503271)]
對于delve在官方網(wǎng)站上有比較詳細的說明,而且安裝情況也是非常簡單。我們只需要點擊installation中的windows。
[圖片上傳失敗...(image-678a30-1593445503271)]
注意:如果在模塊模式下使用Go,則必須在模塊目錄之外執(zhí)行此命令,否則Delve將作為依賴項添加到項目中。

另外,如果尚未設(shè)置,則必須將%GOPATH%\ bin目錄添加到PATH變量中。
[圖片上傳失敗...(image-f6bfbd-1593445503271)]
當(dāng)我們進行下載成功后需要添加到我們的環(huán)境變量中,
[圖片上傳失敗...(image-52d2db-1593445503271)]
當(dāng)然也可以通過%GOPATH%\bin來進行添加即可。所以對于delve的安裝按照官方的文檔進行下去還是非常方便和快捷。進行完安裝后我們就可以開始我們實戰(zhàn)演練部分,對于我們的代碼進行調(diào)試。
對于delve的常用命令我們可以通過dlv –-help 來進行了解
[圖片上傳失敗...(image-2f3936-1593445503271)]
PS:踩坑日記:很多小伙伴也有反饋即使我們安裝完delve在goland中也無法使用我們的delve來進行代碼的調(diào)試,因為goland中出現(xiàn)

Version of Go is too old for this version of Delve (minimum supported version 1.13, suppress this error with --check-go-version=false 

要解決這個方法很簡單,我們在gopath中安裝好delve后會生成bin目錄,在bin文件夾中會有dlv.exe
[圖片上傳失敗...(image-90bb4d-1593445503271)]
然后我們只需要在goland中進行配置一下即可。
[圖片上傳失敗...(image-187ba7-1593445503271)]
然后添加相應(yīng)的dlv.path為你gopath下的dlv.exe路徑,然后重啟即可
[圖片上傳失敗...(image-60e46d-1593445503271)]
實操演練:
這里我準備了一個簡單的項目進行調(diào)試
[圖片上傳失敗...(image-9afa09-1593445503271)]
如圖所示可以看到這個是一個非常簡單的web服務(wù)器代碼
[圖片上傳失敗...(image-3a766b-1593445503271)]
然后我們進入到相應(yīng)dos界面執(zhí)行dlv debug main.go
[圖片上傳失敗...(image-5597f1-1593445503271)]
我們可以用sources來進行查看源文件。
[圖片上傳失敗...(image-f1c781-1593445503271)]
以下是給大家羅列了一些關(guān)于dlv的常用命令。方便大家查看

The following commands are available:
    args ------------------------ 打印函數(shù)參數(shù).
    break (alias: b) ------------ 設(shè)置斷點.
    breakpoints (alias: bp) ----- 輸出活動斷點的信息.
    call ------------------------ 恢復(fù)進程,注入一個函數(shù)調(diào)用(還在實驗階段!!)
    clear ----------------------- 刪除斷點.
    clearall -------------------- 刪除多個斷點.
    condition (alias: cond) ----- 設(shè)置斷點條件.
    config ---------------------- 修改配置參數(shù).
    continue (alias: c) --------- 運行到斷點或程序終止.
    deferred -------------------- 在延遲調(diào)用的上下文中執(zhí)行命令.
    disassemble (alias: disass) - 反匯編程序.
    down ------------------------ 將當(dāng)前幀向下移動.
    edit (alias: ed) ------------ 在$DELVE_EDITOR或$EDITOR中打開你所在的位置
    exit (alias: quit | q) ------ 退出調(diào)試器.
    frame ----------------------- 設(shè)置當(dāng)前幀,或在不同的幀上執(zhí)行命令.
    funcs ----------------------- 打印函數(shù)列表.
    goroutine ------------------- 顯示或更改當(dāng)前goroutine
    goroutines ------------------ 列舉程序goroutines.
    help (alias: h) ------------- 打印幫助信息.
    list (alias: ls | l) -------- 顯示源代碼.
    locals ---------------------- 打印局部變量.
    next (alias: n) ------------- 轉(zhuǎn)到下一個源行.
    on -------------------------- 在命中斷點時執(zhí)行命令.
    print (alias: p) ------------ 計算一個表達式.
    regs ------------------------ 打印CPU寄存器的內(nèi)容.
    restart (alias: r) ---------- 重啟進程.
    set ------------------------- 更改變量的值.
    source ---------------------- 執(zhí)行包含delve命令列表的文件
    sources --------------------- 打印源文件列表.
    stack (alias: bt) ----------- 打印堆棧跟蹤信息.
    step (alias: s) ------------- 單步執(zhí)行程序.
    step-instruction (alias: si)  單步執(zhí)行一條cpu指令.
    stepout --------------------- 跳出當(dāng)前函數(shù).
    thread (alias: tr) ---------- 切換到指定的線程.
    threads --------------------- 打印每個跟蹤線程的信息.
    trace (alias: t) ------------ 設(shè)置跟蹤點.
    types ----------------------- 打印類型列表
    up -------------------------- 向上移動當(dāng)前幀.
    vars ------------------------ 打印包變量.
    whatis ---------------------- 打印表達式的類型.

在命令前鍵入help來獲得命令的完整文檔,如help goroutine
接下來就是進行斷點的標(biāo)注,我們可以使用 b 代碼位置:行數(shù) 進行標(biāo)注。
[圖片上傳失敗...(image-3f2a8d-1593445503271)]

標(biāo)注完成后 直接輸入c 可以進行查看源代碼。
[圖片上傳失敗...(image-7f59a5-1593445503271)]
使用next 可以進行下一步,進行調(diào)試。
[圖片上傳失敗...(image-a45041-1593445503271)]
[圖片上傳失敗...(image-4e9247-1593445503271)]
當(dāng)然針對更多的dlv命令還需要小伙伴們下來之后進行多多嘗試才行。相互學(xué)習(xí),共同進步,我是小棧君,我們下期再見!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容