網站首頁 編程語言 正文
前言
在前邊幾篇文章中分享了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第一個元素的左節點
原文鏈接:https://juejin.cn/post/7127638222330396686
相關推薦
- 2022-11-19 C語言結構體成員賦值的深拷貝與淺拷貝詳解_C 語言
- 2022-11-10 Kotlin?協程異步熱數據流的設計與使用講解_Android
- 2022-10-08 ASP.NET堆和棧一之基本概念和值類型內存分配_實用技巧
- 2022-06-01 詳解C語言的void*空指針_C 語言
- 2023-01-09 Pyscript使用本地Pyodide配置步驟_python
- 2022-04-11 git 強行拉取覆蓋本地方法(Git強制覆蓋本地代碼)
- 2022-04-12 Taro打包Android?apk過程詳解_Android
- 2022-10-12 golang?執行命令行的實現_Golang
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支