<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Go 的 Debug 工具 delve 介紹

          共 2501字,需瀏覽 6分鐘

           ·

          2020-06-26 23:23

          delve 的漢語意思是:鉆研、探索;用這個來命名一個debug工具還是非常的形象。

          本文主要介紹該工具的安裝與常用使用方法。是一個step-by-step的文章。目標是幫助大家學(xué)會如何使用 delve 來debug自己的代碼。

          安裝

          官網(wǎng)的安裝文檔地址:https://github.com/go-delve/delve/tree/master/Documentation/installation

          我再重復(fù)下如何在 Mac 上進行安裝。

          首先 xcode-select --install 把依賴的編譯工具鏈安裝一下。

          然后通過下面的命令即可完成

          $ go get github.com/go-delve/delve/cmd/dlv

          這里有個注意點,大家如果使用modules的方式來管理項目,應(yīng)該知道安裝依賴包也是上面這個命令。所以執(zhí)行上面的命令時,請確保自己不是在一個go modules的路徑下。

          到此,安裝工作就可以完成了,可以在終端執(zhí)行,可以看到如下畫面:

          ? /Users/dayu >dlv version
          Delve Debugger
          Version: 1.4.0
          Build: $Id: 67422e6f7148fa1efa0eac1423ab5594b223d93b $
          命令介紹

          用中文來翻譯下命令的含義。

          Usage:
          dlv [command]

          Available Commands:
          attach 可以用來對一個正在運行的進行進行調(diào)試.
          connect 連接到headless調(diào)試器.
          core 用來調(diào)試core文件.
          dap [EXPERIMENTAL] 啟動一個Debug Adaptor Protocol (DAP)的TCP服務(wù)器來通信.
          debug 在當前包或者指定的包編譯并debug程序.
          exec 如果你已經(jīng)編譯好了二進制,可以用該命令啟動調(diào)試.
          help 幫助命令.
          test 可以用來測試自己編寫的測試源碼文件.
          trace 編譯并跟蹤程序.

          dlv 的命令非常多,主要介紹下 debugattach 的使用。其它命令大家可以嘗試下,不過一般用的也非常少!dlv test 這個也非常有用,不過使用跟debug差不多。

          使用

          下面將主要介紹這 debugattach 如何使用,這兩個命令其實主要面對兩種使用場景。

          1. 用 Golang 寫了一個命令行程序,想要debug一下;
          2. 寫了一個 Grpc 或者 Http 服務(wù),運行的進行進行debug;

          進入調(diào)試后,他們的命令非常相似,下面開始我們的 debug 之旅。

          Debug Main包程序

          先來看直接使用 debug 來調(diào)試代碼。調(diào)試的代碼樣例:

          4494a70254e6a597fe5ca61b6e89273d.webp

          debug調(diào)試代碼

          此時在終端進入該文件所在路徑,然后執(zhí)行

          dlv debug

          然后會成功進入 delve 提供的debug交互界面,如下圖所示。

          b3644852707c9afadf2e04402229d935.webp

          debug交互

          圖中展示了三個非常常用的命令。來分別解釋下。

          • b main.main

          這個命令的全拼是:break main.main 用來設(shè)置斷點的。除了這種寫法,常用的還有使用行號來設(shè)置斷點 b 9。

          • bp

          這個命令是用來查找已經(jīng)設(shè)置的斷點的。

          3a8b651fca77ce6b55dbd1882afc43e2.webp

          斷點查看

          查看已經(jīng)設(shè)置的斷點常常一個目的是用來尋找 clear 可以清除哪一個斷點。

          • c

          該命令是讓程序運行起來。遇到設(shè)置的斷點會停止。


          上面只是非?;A(chǔ)的三個命令,我們再來繼續(xù)往下走。繼續(xù)看這張執(zhí)行示例圖

          53208b1862a504840a042edbc78657cb.webp

          調(diào)試

          這張圖中的命令,都是非常常用的調(diào)試命令,來一起看看作用

          • restart

          這個命令的主要作用就是一輪debug完成了,重新開始下一輪,上一次設(shè)置的斷點會依然有效

          • n

          這是執(zhí)行下一步,也就是代碼的下一行。它就是一行一行的往下,不會陷入內(nèi)部去

          • s

          該命令注意與 n 的區(qū)別,它是進入某個函數(shù)的內(nèi)部,源碼函數(shù)也能夠跟蹤進去,非常有利于我們學(xué)習(xí)。但是對于 goroutine 執(zhí)行的函數(shù)你是無法進入的。這也很好理解,因為它的執(zhí)行時機不可知。

          • p

          這個是debug過程中非常重要的一個命令,打印變量的值。也是學(xué)習(xí) go 語言的一個利器,圖中可以看到一個 channel 初始化之后的內(nèi)部結(jié)構(gòu)體。這對我們理解源碼非常有幫助。


          下面的命令圖中沒有演示,但覺得有必要說一下。

          • so

          如果用了 s 陷入到內(nèi)部函數(shù),可以快速使用該命令跳出來,回到進入點。

          • gr and grs

          這兩個命令是用來查看 groutine 的。

          他還有非常多的命令。我們可以在使用過程中隨時使用 help 來進行查看。文末我也放了一張所有命令圖的翻譯。

          Debug運行的進程

          對于運行中的進程,主要說明下如何進入 debug 交互界面,進入后的操作與上面是一樣的。

          假如我們有一個 http 的進程在運行,看一下如何進行 debug。示例代碼如下:

          func main() {
          http.HandleFunc("/", Hello)

          http.ListenAndServe(":8080", nil)
          }

          func Hello(w http.ResponseWriter, r *http.Request) {
          a := "test"

          fmt.Println(a)

          time.Sleep(3 * time.Second)

          fmt.Fprint(w, "Hello World")
          }

          將這個 demo 給運行起來,然后找到他的進程號。執(zhí)行下面的命令:

          dlv attach {pid}

          這個 pid 就是當前進程的進程號。

          使用該方式要注意:設(shè)置完斷點后記得用 c 讓進程處于運行狀態(tài),否則對于 http 或者 grpc 的程序,沒有辦法繼續(xù)接受請求,進而無法進入測試。

          bd931abf6d08935b0db3ca4ac4ee5587.webp


          參考資料

          [1] https://github.com/go-delve/delve




          推薦閱讀



          喜歡本文的朋友,歡迎關(guān)注“Go語言中文網(wǎng)

          Go語言中文網(wǎng)啟用信學(xué)習(xí)交流群,歡迎加微信274768166,投稿亦歡迎



          瀏覽 79
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  中文字幕 日本有码 | 五月婷婷深爱网 | 97骚女在线 | 青青操在线观看 | 午夜三级电影 |