go runtime debug 小技巧

2020-09-22 新世界雜貨鋪

來自公眾號:新世界雜貨鋪

前言

本意是打算研究一下go程序的啟動流程,然後就去網上搜索了一下入門教程。結果令我有點沮喪,搜到的幾乎所有文章開篇都是通過GDB調試, 然後就是不同平臺下的彙編代碼。。。

這令我很不開心, 雖然C/C++應用很廣泛, 但是我對它真的沒啥興趣啊, 對它相關的調試工具就更加不感冒了, 雖然它可以調試go程序, 但是總感覺心裡少了點什麼, 難道dlv它不香嘛, 於是就有了今天這篇文章

dlv命令行debug

dlv的名頭應該不用我多說, 所以我們直奔主題

  1. 開始debug

dlv debug test.go

執行上述命令後, 就會進入debug交互命令行界面, 在這個界面任何時候輸入h都會列印幫助信息.

  1. 增加函數斷點

在test.go的文件第6行打上一個斷點b test.go:6

  1. 開始執行

如上圖所示, 我們繼續執行時會發現=>會停留在我們前面標記的斷點處。這裡的其他命令我們在本篇文章不做過多的介紹了, 我們儘量緊扣本篇的主題。

  1. 列印調用棧

如上圖所示, 我們通過dlv的調用棧可以看見調用main函數之前,還執行了asm_amd64.s(本次debug的機器為mac)的彙編代碼和proc.go的main函數。

意外之喜, 本來只是單純的不想用GDB調試去了解go程序的啟動流程, 現在卻也有了一些頭緒, 下面我們繼續本篇的主題

  1. 在runtime包中標記斷點並開始調試

綜上: 按照上面的步驟, 我們通過dlv就可以進行runtiime的調試, 並且還可以了解go程序的啟動流程

vscode圖形化debug

我個人比較喜歡用vscode進行代碼編輯, 所以在擼go的時候用的也是vscode, 體驗還是非常不錯的

關於vscode如何配置go的開發環境和配置圖形化debug就不再本篇過多贅述, 筆者在這裡分享一下自己在vscode中關於go的配置

&34;: true,&34;: { &34;: true, &34;: true, &34;: true},&34;: [&34;],&34;: true,&34;: true,&34;: true,&34;: true,&34;: true,

  1. 打斷點

本部分在備用電腦上面完成,go版本為: go1.14.2

此次直接復用了前面文章的demo。三個斷點分別位於,main/test.go, runtime/proc.go和runtime/string.go.

  1. 運行

vscode通過F5快捷鍵即可快速開始debug

接下來, 你就可以開始快樂的debug之旅啦

debug不出現在call stack的函數

細心的同學肯定已經發現了,在上面vscode圖形化debug的調用棧裡面並沒有runtime/string.go的影子。接下來, 我們結合本篇的主題繼續往下分析

相信看過我這篇文章的同學,心裡已經基本有數了。對於這種即沒有調用棧也沒有明確調用者的函數,我們遵循以下兩點即可完成對它的debug

  1. 首先查看其彙編代碼

6A737D; --tt-darkmode-color: 6A737D; --tt-darkmode-color: 6A737D; --tt-darkmode-color: #6A737D;">原創不易, 卑微求關注收藏二連.

相關焦點

  • go runtime debug 小技巧
    在runtime包中標記斷點並開始調試綜上: 按照上面的步驟, 我們通過dlv就可以進行runtiime的調試, 並且還可以了解go程序的啟動流程vscode圖形化debug我個人比較喜歡用vscode進行代碼編輯, 所以在擼go的時候用的也是vscode, 體驗還是非常不錯的關於vscode如何配置go的開發環境和配置圖形化debug就不再本篇過多贅述
  • GO語言入門
    打開GC日誌(1) 加上GODEBUG環境變量GODEBUG=gctrace=1 go test -bench=.GODEBUG=gctrace=1 go run main.go(2) 日誌詳情信息參考:https://godoc.org/runtime3. go tool trace(1) 普通程序輸出trace信息(2) 測試程序輸出
  • Go 協程堆棧設計進化之旅
    堆棧的大小定義,我們可以在這裡找到 runtime/stack.go:// The minimum size of stack used$112-0 [...] 0x00b0 00176 (/go/src/main.go:5) CALL runtime.morestack_noctxt(SB)[...]0x0000 00000 (/go/src/main.go:13) TEXT "".max(SB), NOSPLIT|ABIInternal, $0-24有兩條指令涉及到棧大小的更改:-
  • 你喜歡的 Go 第三方庫:一步為系統集成可視化實時運行時統計
    比如內存、GC 等情況,可以通過 runtime.MemStats 獲取:https://docs.studygolang.com/pkg/runtime/#MemStats,Goroutine 數量可以通過 runtime.NumGoroutine() 函數獲得。
  • Android Studio Debug 的 9 個小技巧
    周末看 Android Dev Summit '19 的視頻的時候,看到一章關於 Android Studio Debug 的介紹,有很多日常非常有用的小技巧,學習了這些小技巧能很大程度的降低我們 Debug 的成本,快速定位問題的本質,今天就向大家介紹一下 Android Studio Debug 的 9 個小技巧。
  • 分析Go程序的Off-CPU性能
    如果你使用 /debug/pprof/profile 進行分析的話, 可以修改代碼:import _ "net/http/pprof"func main() { go func()tool pprof -http=:6061 http://localhost:6060/debug/pprof/profile?
  • GO語言預計八月發新,1.9版本亮點搶先看!
    根據thedraft的發行說明,新版的Go語言有不小的變化,增加了對類別別名的支持,大多數更改是在工具鏈,運行時和庫的實現層面。  在庫中,go/ast的TypeSpec有一個新的領域,go/types有一個新的類型,即types.Alias。這些都是庫級別的更改。Go類型語義的代碼可能需要更新以處理別名,這會影響到編程工具,但這在幾乎任何語言的更改中都是無可避免的。
  • 通過這個 Runtime 統計信息可視化庫學到了什麼?
    比如內存、GC 等情況,可以通過 runtime.MemStats 獲取:https://docs.studygolang.com/pkg/runtime/#MemStats,Goroutine 數量可以通過 runtime.NumGoroutine() 函數獲得。
  • go程序會用幾個CPU?
    那麼go runtime是用的什麼方法來得到可以使用的核數的呢,是使用的類似lscpu或者讀取/proc/cpuinfo之類的方法麼?繼續看代碼,在runtime/debug.go中,可以看到是直接讀取的ncpu這個全局變量得到的,而且注釋裡面很明確的說明了這個值是在進程初始化的時候讀取的
  • Go 語言的自身系統監控都做了哪些事?
    函數(位於:go/src/runtime/proc.go 文件中)中啟動程序時創建。基本流程如下:調用 runtime.newm 函數,創建一個 runtime.m 結構對象。runtime.newm 函數再調用 runtime.newm1 函數,然後調用 runtime.newsproc 函數,系統調用 clone 一個線程。
  • 「GCTT 出品」在 go 中如何調用私有函數(綁定隱藏的標識符)
    用這些技巧我曾設法綁定 golang 運行時調度器相關的函數用以減少過度使用 go 的協程和內部鎖機制導致的 gc 停頓。使用 assembly stubs想法很簡單 - 為需要的標識符提供直接跳轉彙編指令 stubs 。連結器並不知道標識符是否已導出。
  • 經驗分享:C++編程中的四個調試小技巧
    經驗分享:C++編程中的四個調試小技巧 本文介紹的是C++中的一些編程的小技巧,希望對你有幫助,一起來看。作者:佚名來源:網際網路|2011-07-12 13:41 下面介紹C++編程的四個小技巧
  • 「GCTT 出品」Go 執行追蹤器(execution tracer)
    會使用到 runtime/trace 包,用於控制開始/停止寫追蹤數據;數據會被寫到標準錯誤輸出。在例圖中,我們可以看到: Goroutine 「G1 runtime.main」產生出兩個不同的 Goroutine:G6 和 G5 (前者負責收集追蹤信息,後者是使用「go」關鍵字產生的)。每個虛擬處理器的第二行可能會顯示額外的事件,例如系統調用和運行時事件。同時包括了 goroutine 為運行時做的一些工作(例如,協助垃圾收集)。
  • 讓Go無路可go的十個方法
    1.數組/切片索引越界func main() { names := []string{ &34;, &34;, &34;, } name := names[len(names)] fmt.Printf(&34;, name)}運行結果:panic: runtime
  • 騰訊開發工程師分享:一起go routine 洩漏問題的排查
    避免 goroutine 洩漏的關鍵是要合理管理 goroutine 的生命周期,通過導出 runtime 指標和利用 pprof 可以發現和解決 goroutine 洩漏問題。筆者維護了一個通過 SSH 連接到目標機器並執行命令的服務,這是一個內部小服務,平時沒有問題的時候一般也不會關注。
  • Go GC 20 問
    我們來看一個例子:package mainimport ( &34; &34;)func main() { go func() { for { } }() time.Sleep(time.Millisecond) runtime.GC() println(&34;)}
  • 從源碼開始分析Go語言的切片
    :10) LEAQ type.int(SB), AX0x0034 00052 (slice.go:10) CALL runtime.makeslice(SB)0x003e 00062 (slice.go:11) LEAQ type.int(SB), CX0x005f 00095 (slice.go:11) CALL runtime.growslice(SB)0x008c 00140 (slice.go
  • Go: gops如何與Go運行時交互?
    這是輸出結果:295 1 gops go1.13 /go/src/github.com/google/gops/gops168 1 prime-number* go1.13 /go/prime-number/prime-numbe
  • 精靈寶可夢GO補給站又一隱藏小技巧分享
    精靈寶可夢GO補給站又一隱藏小技巧分享,精靈寶可夢GO中補給站在玩家們知道短期們轉夠10個可以獲得雙倍的道具後,又一補給站的小技巧已經被發現了,一起看看如何提升精靈球的獲得機率吧。
  • Go 語言 GUI 庫 GoQt 0.1 發布 - OSCHINA - 中文開源技術交流社區
    安裝GoQt### 1.get goqt    > go get github.com/visualfc/goqt### 2.build qtdrv, need install QtSDK    > cd goqt/qtdrv    > qmake "CONFIG+=release"    > make###