go runtime debug 小技巧
來自公眾號:新世界雜貨鋪
前言
本意是打算研究一下 go 程式的啟動流程,然後就去網上搜尋了一下入門教程。結果令我有點沮喪,搜到的幾乎所有文章開篇都是通過GDB除錯, 然後就是不同平臺下的彙編程式碼。。。
這令我很不開心, 雖然 C/C++ 應用很廣泛, 但是我對它真的沒啥興趣啊, 對它相關的除錯工具就更加不感冒了, 雖然它可以除錯 go 程式, 但是總感覺心裡少了點什麼, 難道dlv它不香嘛, 於是就有了今天這篇文章
dlv 命令列 debug
dlv 的名頭應該不用我多說, 所以我們直奔主題
- 開始 debug
dlv debug test.go
執行上述命令後, 就會進入 debug 互動命令列介面, 在這個介面任何時候輸入h
都會列印幫助資訊.
- 增加函式斷點
# 互動介面輸入下面命令後, 會在main包下的main函式打上一個斷點
b main.main
- 指定行斷點
# 在test.go的檔案第6行打上一個斷點
b test.go:6
- 開始執行
如上圖所示, 我們繼續執行時會發現=>
會停留在我們前面標記的斷點處。這裡的其他命令我們在本篇文章不做過多的介紹了, 我們儘量緊扣本篇的主題。
- 列印呼叫棧
如上圖所示, 我們通過 dlv 的呼叫棧可以看見呼叫 main 函式之前,還執行了 asm_amd64.s(本次 debug 的機器為 mac) 的彙編程式碼和 proc.go 的 main 函式。
意外之喜, 本來只是單純的不想用 GDB 除錯去了解 go 程式的啟動流程, 現在卻也有了一些頭緒, 下面我們繼續本篇的主題
- 在 runtime 包中標記斷點並開始除錯
綜上: 按照上面的步驟, 我們通過 dlv 就可以進行 runtiime 的除錯, 並且還可以瞭解 go 程式的啟動流程
vscode 圖形化 debug
我個人比較喜歡用 vscode 進行程式碼編輯, 所以在擼 go 的時候用的也是 vscode, 體驗還是非常不錯的
關於 vscode 如何配置 go 的開發環境和配置圖形化 debug 就不再本篇過多贅述, 筆者在這裡分享一下自己在 vscode 中關於 go 的配置
"go.useLanguageServer": true,
"go.languageServerExperimentalFeatures": {
"format": true,
"diagnostics": true,
"documentLink": true
},
"go.languageServerFlags": ["-rpc.trace"],
"go.gotoSymbol.includeGoroot": true,
"go.gotoSymbol.includeImports": true,
"go.useCodeSnippetsOnFunctionSuggestWithoutType": true,
"go.useCodeSnippetsOnFunctionSuggest": true,
"go.autocompleteUnimportedPackages": true,
- 打斷點
本部分在備用電腦上面完成,go 版本為: go1.14.2
此次直接複用了前面文章go 中字串轉位元組切片的容量的 demo。三個斷點分別位於,main/test.go, runtime/proc.go 和 runtime/string.go.
- 執行
vscode 通過 F5 快捷鍵即可快速開始 debug
接下來, 你就可以開始快樂的 debug 之旅啦
debug 不出現在 call stack 的函式
細心的同學肯定已經發現了,在上面 vscode 圖形化 debug 的呼叫棧裡面並沒有 runtime/string.go 的影子。接下來, 我們結合本篇的主題繼續往下分析
相信看過我切片真的是引用嘛?這篇文章的同學,心裡已經基本有數了。對於這種即沒有呼叫棧也沒有明確呼叫者的函式,我們遵循以下兩點即可完成對它的 debug
- 首先檢視其彙編程式碼
# go程式碼轉匯編
go tool compile -N -l -S test.go
關鍵彙編程式碼如下:
如上圖所示,我們發現了stringtoslicebyte
函式, 這樣我們就可以打斷點了, 只要打上了斷點就可以快樂的除錯了
- runtime 函式打斷點時機
部分 rumtime 函式打好斷點後, debug 程式會無法啟動, 這個時候就需要延遲打點 (“延遲打點” 為筆者自己總結的名字) 了。
首先,在 main 函式的入口處打一個斷點(呼叫 runtime 函式之前的斷點均可),刪除 runtime 函式的斷點。
最後, 等待 debug 程式啟動了,再給 runtime 函式打上斷點即可。
至此, 祝各位開啟快樂的 debug 之旅。
注: 寫本文時, 筆者所用 go 版本為: go1.13.4;
生命不息, 探索不止, 後續將持續更新有關於 go 的技術探索
原創不易, 卑微求關注收藏二連.
- 加微信實戰群請加微信(註明:實戰群):gocnio
相關文章
- 前端效能監測,Runtime Performance Debug 技巧前端ORM
- IDEA小技巧:Debug條件斷點Idea斷點
- IDEA小技巧:Debug拖動跳轉任意行Idea
- 身為前端開發者,你不能不知道的 Runtime Performance Debug 技巧前端ORM
- Go: sysmon, Runtime MonitoringGo
- Runtime小結
- AndroidStudio使用技巧-debug篇Android
- IDEA小技巧:Debug時如何優雅地製造異常?Idea
- debug技巧之本地除錯除錯
- 工具 | 常用 MySQL 核心 Debug 技巧MySql
- Go Runtime 的排程器Go
- Eclipse的Debug介紹與技巧Eclipse
- debug技巧之使用Arthes除錯除錯
- debug技巧之遠端除錯除錯
- 小技巧分享:在 Go 如何實現列舉?Go
- Go GPM的理解 與 runtime包Go
- Node程式debug小記
- 小陳的debug之路
- 最牛的debug技巧,不看後悔!
- 【Java】Debug斷點除錯常用技巧Java斷點除錯
- 五個 goland 進行 go 開發的小技巧GoLand
- K8s容器debug高階技巧K8S
- Go runtime 排程器精講(一):Go 程式初始化Go
- Debug和幾個小例項
- 全網最牛的debug技巧,不看後悔!
- Vivado使用技巧(21):模擬中的Debug特性
- 小技巧
- Go 開發技巧Go
- go技巧分享(二)Go
- Go runtime 排程器精講(七):案例分析Go
- 快速接手新專案技巧:使用Runtime找到UIImage名字UI
- Go 最直接的debug 方式 輸出函式Go函式
- Go runtime 排程器精講(五):排程策略Go
- Go runtime 排程器精講(三):main goroutine 建立GoAI
- dubbo debug過程中發現的IDEA有趣的小發現及dubbo消費者debug小tipsIdea
- PHP 小技巧PHP
- git小技巧Git
- JavaScript?小技巧JavaScript