Go Wiki: heapdump14
其他版本的堆轉儲格式
- Go 1.3: heapdump13
- Go 1.5 及更高版本: heapdump15-through-heapdump17
引言
Go 1.4 具有 runtime/debug.WriteHeapDump 函式,該函式將堆中的所有物件以及額外資訊(根、goroutines、finalizers 等)寫入檔案。該檔案的格式在此處指定。
詳細資訊
檔案以字串“go1.4 heap dump\n”的位元組開頭。
檔案的其餘部分是一系列記錄。記錄可以有幾種不同的型別。記錄將包含以下基本型別:
- uvarint - 一個 64 位無符號整數,編碼方式與 `encoding/binary` 中的 `Put/ReadUvarint` 相同
- string - 一個 uvarint 編碼的長度,後跟該長度的位元組資料
- bool - 一個 uvarint 編碼的 0(表示 false)或 1(表示 true)
- fieldlist - 記憶體區域中包含指標的部分的描述。它由 uvarints 編碼的欄位型別和欄位偏移量的重複對組成,後跟列表結束標記。可能的型別為 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: 包含此型別值的介面的 data 欄位是否是指標
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:堆的結束地址
- uvarint: 架構說明符
- string:GOEXPERIMENT 環境變數的值
- uvarint:`runtime.ncpu`
finalizer
- uvarint:具有 finalizer 的物件的地址
- uvarint:指向描述 finalizer 的 `FuncVal` 的指標
- uvarint:finalizer 入口點的 PC
- uvarint:finalizer 引數的型別
- uvarint:物件的型別
此 finalizer 已註冊到執行時系統,但它引用的物件在最近一次 GC 時是可達的,或者是在最近一次 GC 之後分配的。
itab
- uvarint:Itab 地址
- uvarint: 所包含型別的型別描述符的地址
osthread (M)
- uvarint:此作業系統執行緒描述符的地址
- uvarint:執行緒的 Go 內部 ID
- uvarint:作業系統執行緒的 ID
memstats
轉儲 MemStats 的前 26 個欄位。所有欄位都用 uvarint 轉儲,第 25 個欄位用 256 個 uvarints 轉儲。
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 的一部分。