首頁 > 軟體

Go語言編譯原理之原始碼偵錯

2022-08-04 22:05:01

前言

在前邊幾篇文章中分享了Go編譯過程中的原始碼實現,本文主要是想分享一下我是怎麼偵錯Go的原始碼的(如果你很熟悉的話,可以跳過本文)。本文主要是分享兩種Go原始碼的偵錯方法

  • Goland的debug
  • dlv工具

本文我還會以抽象語法樹為例,來通過dlv對它的構建過程進行偵錯

Goland的debug偵錯Go原始碼

下邊以偵錯Go編譯的入口檔案為例

編輯debug設定

填寫設定資訊

打斷點,並開始執行

偵錯

這些偵錯按鈕的功能其實跟其他的IDEA是一樣的,之前整理過,這裡不重複整理了,不清楚的小夥伴可以看這裡

dlv工具偵錯Go原始碼

安裝

這裡以mac為例

brew install dlv

啟動

$ dlv debug 待偵錯檔案

常用命令

可以通過下邊的方式檢視一些常用的命令

$ gc dlv debug /usr/local/go/src/cmd/compile/main.go
Type 'help' for list of commands.
(dlv) help
The following commands are available:
Running the program:
    call ------------------------ (EXPERIMENTAL!!!)恢復程序,注入函數呼叫(實驗的)
    continue (alias: c) --------- 執行到斷點或程式終止
    next (alias: n) ------------- 執行下一行.
    rebuild --------------------- 重新生成目標可執行檔案並重新啟動它. 如果可執行檔案不是由dlv構建,它就不能工作.
    restart (alias: r) ---------- 重新啟動一個程序.
    step (alias: s) ------------- 單步偵錯.
    step-instruction (alias: si)  Single step a single cpu instruction.
    stepout (alias: so) --------- Step out of the current function.
Manipulating breakpoints:
    break (alias: b) ------- 設定一個端點.
    breakpoints (alias: bp)  列印所有的端點資訊.
    clear ------------------ 清除端點.
    clearall --------------- 刪除多個端點.
    condition (alias: cond)  設定斷點條件.
    on --------------------- 在命中斷點時執行命令.
    toggle ----------------- 開啟或關閉斷點.
    trace (alias: t) ------- Set tracepoint.
    watch ------------------ Set watchpoint.
Viewing program variables and memory:
    args ----------------- 列印函數引數.
    display -------------- 每次程式停止時列印表示式的值.
    examinemem (alias: x)  檢查給定地址的原始記憶體.
    locals --------------- 列印區域性變數.
    print (alias: p) ----- 列印變數值.
    regs ----------------- 列印CPU暫存器的內容.
    set ------------------ 更改變數的值.
    vars ----------------- 列印包變數.
    whatis --------------- 列印表示式的型別.
Listing and switching between threads and goroutines:
    goroutine (alias: gr) -- 顯示或更改當前goroutine
    goroutines (alias: grs)  列出程式goroutines.
    thread (alias: tr) ----- 切換到指定的執行緒.
    threads ---------------- 列印每個跟蹤執行緒的資訊.
Viewing the call stack and selecting frames:
    deferred --------- 在延遲呼叫的上下文中執行命令.
    down ------------- 向下移動當前幀.
    frame ------------ 設定當前幀,或在其他幀上執行命令.
    stack (alias: bt)  列印堆疊資訊.
    up --------------- 向上移動當前幀
Other commands:
    config --------------------- 更改設定引數.
    disassemble (alias: disass)  Disassembler.
    dump ----------------------- 從當前程序狀態建立核心轉儲
    edit (alias: ed) ----------- Open where you are in $DELVE_EDITOR or $EDITOR
    exit (alias: quit | q) ----- 退出偵錯.
    funcs ---------------------- 列印函數列表.
    help (alias: h) ------------ 列印幫助資訊.
    libraries ------------------ 列出載入的動態庫
    list (alias: ls | l) ------- 展示原始碼.
    source --------------------- 執行包含delve命令列表的檔案
    sources -------------------- 列印原始檔列表
    types ---------------------- 列印型別列表
Type help followed by a command for full documentation.
(dlv)

dlv偵錯抽象語法樹構建

下邊利用dlv來偵錯Go編譯過程中的抽象語法樹構建。我這裡沒有粘程式碼,你可以開啟原始碼對著下邊看

  • 啟動dlv,並偵錯Go編譯的入口檔案

  • 設定斷點、continue的使用、n的使用(r 設定編譯器編譯目標檔案)

  • 在指定檔案的指定位置設定斷點

  • 列印抽象語法樹構建出來的結果(xtop)

你也可以列印xtop下邊元素的值,比如檢視xtop第一個元素的左節點

以上就是Go語言編譯原理之原始碼偵錯的詳細內容,更多關於Go編譯原理原始碼偵錯的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com