Go Wiki:heapdump15 至 heapdump17
其他版本的堆疊傾印格式
- Go 1.3:heapdump13
- Go 1.4:heapdump14
簡介
Go 1.5 有 runtime/debug.WriteHeapDump 函式,會將堆疊中的所有物件以及其他資訊 (根、goroutine、完成處理函式等) 寫入檔案。此檔案的格式在此指定。
詳細資料
檔案以字串「go1.5 heap dump\n」的位元組開頭。此說明也適用於以「go1.6 heap dump\n」和「go1.7 heap dump\n」開頭的檔案。go1.6 格式與 1.5 相同,而 go1.7 格式有一個小變更,如下所述。
檔案的其餘部分是一連串記錄。記錄可以有幾種不同的種類。記錄將包含下列基本型別
- uvarint - 64 位元無號整數,編碼方式如 encoding/binary.{Put,Read}Uvarint
- 字串 - uvarint 編碼長度,後接等長度的資料位元組
- 布林值 - uvarint 編碼的 0 代表 false,1 代表 true
- fieldlist - 記憶體區域中包含指標的部分的說明。它包含重複的 uvarint 成對編碼,編碼欄位種類和欄位偏移,後接清單結束標記。唯一可能的種類是 1=Ptr。較早版本的堆疊傾印可能包含 2=Iface 和 3=Eface,但執行階段不再追蹤該資訊,因此傾印中不會出現。介面值顯示為一對指標。0=Eol 是清單結束標記。清單結束標記沒有對應的偏移。
每筆記錄以 uvarint 編碼整數開頭,說明記錄的類型
- 0 = EOF
- 1 = 物件
- 2 = otherroot
- 3 = 類型
- 4 = goroutine
- 5 = 堆疊框架
- 6 = 傾印參數
- 7 = 已註冊的完成處理常式
- 8 = itab
- 9 = 作業系統執行緒
- 10 = 記憶體統計資料
- 11 = 排隊的完成處理常式
- 12 = 資料區段
- 13 = bss 區段
- 14 = defer 記錄
- 15 = panic 記錄
- 16 = 分配/釋放剖析記錄
- 17 = 分配堆疊追蹤範例
每筆記錄的其餘欄位取決於類型,說明如下。
EOF
EOF 記錄沒有欄位,且必須出現在最後。
物件
- uvarint:物件的位址
- 字串:物件的內容
- 欄位清單:描述物件中包含指標的欄位
內容字串的大小是包含的 sizeclass 大小,而不是物件本身的大小。因此,內容大小可能比所包含物件的類型略大。
otherroot
- 字串:此根源自何處的文字描述
- uvarint:根指標
類型
- uvarint:類型描述符的位址
- uvarint:此類型物件的大小
- 字串:類型的名稱
- 布林:包含此類型值的介面的資料欄位類型為 T (false) 或 *T (true)
goroutine (G)
- uvarint:描述符的位址
- uvarint:指標指向堆疊頂端 (目前執行的架構,又稱為深度 0)
- uvarint:goroutine ID
- uvarint:建立此 goroutine 的 go 陳述式的位置
- uvarint:狀態
- 布林:是否為系統啟動的 Go routine
- 布林:是否為背景 Go routine
- uvarint:goroutine 上次開始等待的近似時間 (自紀元以來的奈秒數)
- 字串:等待的文字原因
- uvarint:目前執行的架構的內容指標
- uvarint:os 執行緒描述符 (M) 的位址
- uvarint:頂端 defer 記錄
- uvarint:頂端 panic 記錄
可能的狀態
- 0 = 閒置
- 1 = 可執行
- 3 = 系統呼叫
- 4 = 等待
等待欄位在所有情況下都必須存在,但只有在狀態為「等待」時才有意義。
堆疊架構
- uvarint:堆疊指標(架構中最低位址)
- uvarint:堆疊深度(0 = 堆疊頂端)
- uvarint:子架構的堆疊指標(或 0,若無)
- 字串:堆疊架構的內容
- uvarint:函式的進入 pc
- uvarint:函式的目前 pc
- uvarint:函式的延續 pc(函式可能從何處繼續執行,若有)
- 字串:函式名稱
- fieldlist:此架構中包含指標欄位的種類和偏移量的清單
傾印參數
- 布林值:大端序
- uvarint:指標大小(以位元組為單位)
- uvarint:堆積起始位址
- uvarint:堆積結束位址
- 字串:架構名稱
- 字串:GOEXPERIMENT 環境變數值
- uvarint:runtime.ncpu
finalizer
- uvarint:具有 finalizer 的物件位址
- uvarint:指向描述 finalizer 的 FuncVal
- uvarint:finalizer 進入點的 PC
- uvarint:finalizer 引數類型
- uvarint:物件類型
此 finalizer 已向執行時間系統註冊,但它所參照的物件在最近一次 GC 時仍可存取,或自最近一次 GC 之後才配置。
itab
- uvarint:Itab 位址
- uvarint:所含類型的類型描述符位址
- 在 go1.6 之前,類型永遠是指標類型,並表示 itab.data 欄位的類型。
- 從 go1.7 開始,類型是儲存在介面中的類型。要決定 itab.data 欄位是 T 還是 *T,需要查看所參照類型的描述符中的最後一個布林值。
osthread (M)
- uvarint:此作業系統執行緒描述符的位址
- uvarint:執行緒的 Go 內部 ID
- uvarint:作業系統的執行緒 ID
memstats
記錄下列 runtime.MemStats 欄位
- uvarint:Alloc
- uvarint:TotalAlloc
- uvarint:Sys
- uvarint:Lookups
- uvarint:Mallocs
- uvarint:Frees
- uvarint:HeapAlloc
- uvarint:HeapSys
- uvarint:HeapIdle
- uvarint:HeapInuse
- uvarint:HeapReleased
- uvarint:HeapObjects
- uvarint:StackInuse
- uvarint:StackSys
- uvarint:MSpanInuse
- uvarint:MSpanSys
- uvarint:MCacheInuse
- uvarint:MCacheSys
- uvarint:BuckHashSys
- uvarint:GCSys
- uvarint:OtherSys
- uvarint:NextGC
- uvarint:LastGC
- uvarint:PauseTotalNs
- 256 uvarints:PauseNs
- uvarint:NumGC
queuedfinalizer
- uvarint:具有 finalizer 的物件位址
- uvarint:指向描述 finalizer 的 FuncVal
- uvarint:finalizer 進入點的 PC
- uvarint:finalizer 引數類型
- uvarint:物件類型
此完成處理函式已準備好執行 - 它所參照的物件無法存取。執行時期系統尚未執行它。
資料
- uvarint:資料區段起點的位址
- 字串:資料區段的內容
- 欄位清單:資料區段中包含指標欄位的種類和位移。
bss
格式與資料相同,但適用於 bss 區段。
defer
- uvarint:defer 記錄位址
- uvarint:包含的 goroutine
- uvarint:argp
- uvarint:pc
- uvarint:defer 的 FuncVal
- uvarint:defer 進入點的 PC
- uvarint:連結至下一個 defer 記錄
panic
- uvarint:panic 記錄位址
- uvarint:包含的 goroutine
- uvarint:panic 引數 eface 的型別指標
- uvarint:panic 引數 eface 的資料欄位
- uvarint:目前正在執行的 defer 記錄指標
- uvarint:連結至下一個 panic 記錄
配置/釋放剖析記錄
- uvarint:記錄識別碼
- uvarint:配置物件的大小
- uvarint:堆疊框架數量。對於每個框架
- 字串:函式名稱
- 字串:檔案名稱
- uvarint:行號
- uvarint:配置數量
- uvarint:釋放數量
配置範例記錄
- uvarint:物件的位址
- uvarint:配置/釋放剖析記錄識別碼
此內容是 Go Wiki 的一部分。