Go Wiki: heapdump15-through-heapdump17

其他版本的堆轉儲格式

引言

Go 1.5 包含一個 `runtime/debug.WriteHeapDump` 函式,可以將堆中的所有物件以及額外資訊(roots、goroutines、finalizers 等)寫入檔案。該檔案的格式在此處指定。

詳細資訊

檔案以字串“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/ReadUvarint` 相同
  • string - 一個 uvarint 編碼的長度,後跟該長度的位元組資料
  • bool - 一個 uvarint 編碼的 0(表示 false)或 1(表示 true)
  • fieldlist - 描述記憶體區域中包含指標的部分。它由重複的 uvarint 對組成,編碼欄位型別和欄位偏移量,然後是一個列表結束標記。唯一可能的型別是 1=Ptr。早期版本的堆轉儲可能包含 2=Iface 和 3=Eface,但執行時不再跟蹤這些資訊,因此轉儲中不存在。介面值顯示為一對指標。0=Eol 是列表結束標記。列表結束標記沒有對應的偏移量。

每條記錄都以一個 uvarint 編碼的整數開頭,該整數描述記錄的型別:

  • 0 = EOF(檔案結束)
  • 1 = object(物件)
  • 2 = otherroot(其他根)
  • 3 = type(型別)
  • 4 = goroutine(goroutine)
  • 5 = stack frame(堆疊幀)
  • 6 = dump params(轉儲引數)
  • 7 = registered finalizer(已註冊的 finalizer)
  • 8 = itab(介面表)
  • 9 = OS thread(作業系統執行緒)
  • 10 = mem stats(記憶體統計)
  • 11 = queued finalizer(已排隊的 finalizer)
  • 12 = data segment(資料段)
  • 13 = bss segment(bss 段)
  • 14 = defer record(defer 記錄)
  • 15 = panic record(panic 記錄)
  • 16 = alloc/free profile record(分配/釋放剖析記錄)
  • 17 = alloc stack trace sample(分配堆疊跟蹤樣本)

每條記錄的其餘欄位取決於型別,並在下面進行描述。

EOF

EOF 記錄沒有欄位,並且必須出現在最後。

object

  • uvarint:物件的地址
  • string:物件的內容
  • fieldlist: 描述物件中包含指標的欄位

contents 字串的大小是包含它的 sizeclass 的大小,而不是物件本身的大小。因此,contents 的大小可能比所包含物件型別的大小稍大。

otherroot

  • string:此根的來源的文字描述
  • uvarint:根指標

type

  • uvarint:型別描述符的地址
  • uvarint:此型別物件的尺寸
  • string:型別名稱
  • bool: 包含此型別的值的介面的資料欄位是型別 T(false)還是 *T(true)

goroutine (G)

  • uvarint:描述符的地址
  • uvarint:堆疊頂部(當前執行的幀,又名深度 0)的指標
  • uvarint:goroutine ID
  • uvarint:建立此 goroutine 的 `go` 語句的位置
  • uvarint:狀態
  • bool:是否為系統啟動的 goroutine
  • bool:是否為後臺 goroutine
  • uvarint:goroutine 上次開始等待的大約時間(自紀元以來的納秒)
  • string:它正在等待的文字原因
  • uvarint:當前執行幀的上下文指標
  • uvarint:作業系統執行緒描述符 (M) 的地址
  • uvarint:頂部 defer 記錄
  • uvarint:頂部 panic 記錄

可能的狀態

  • 0 = idle(空閒)
  • 1 = runnable(可執行)
  • 3 = syscall(系統呼叫)
  • 4 = waiting(等待)

在所有情況下都必須存在等待欄位,但只有當狀態為“waiting”時它們才有意義。

stack frame

  • uvarint:堆疊指標(幀中最低的地址)
  • uvarint:堆疊中的深度(0 = 堆疊頂部)
  • uvarint:子幀的堆疊指標(無則為 0)
  • string:堆疊幀的內容
  • uvarint:函式的入口 PC
  • uvarint:函式的當前 PC
  • uvarint:函式的 continuation PC(函式可以恢復的地方,如果可能的話)
  • string:函式名稱
  • fieldlist:此幀中包含指標的欄位的型別和偏移量列表

dump params

  • bool:大端序
  • uvarint:指標大小(位元組)
  • uvarint:堆的起始地址
  • uvarint:堆的結束地址
  • string: 架構名稱
  • string: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 個 uvarint: PauseNs
  • uvarint: NumGC

queuedfinalizer

  • uvarint:具有 finalizer 的物件的地址
  • uvarint:指向描述 finalizer 的 `FuncVal` 的指標
  • uvarint:finalizer 入口點的 PC
  • uvarint:finalizer 引數的型別
  • uvarint:物件的型別

此 finalizer 已準備好執行——它引用的物件是不可達的。執行時系統尚未開始執行它。

data

  • uvarint:資料段起始地址
  • string:資料段的內容
  • fieldlist:資料段中包含指標的欄位的型別和偏移量。

bss

與 data 段格式相同,但用於 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 的 data 欄位
  • uvarint:指向當前正在執行的 defer 記錄的指標
  • uvarint:指向下一個 panic 記錄的連結

alloc/free profile record

  • uvarint:記錄識別符號
  • uvarint:已分配物件的尺寸
  • uvarint:堆疊幀的數量。對於每個幀
    • string:函式名稱
    • string:檔名
    • uvarint:行號
  • uvarint:分配數量
  • uvarint:釋放數量

alloc sample record

  • uvarint:物件的地址
  • uvarint:alloc/free profile record 識別符號

此內容是 Go Wiki 的一部分。