Go Wiki:heapdump14
其他版本的堆转储格式
- Go 1.3:heapdump13
- Go 1.5 及更高版本:heapdump15-through-heapdump17
简介
Go 1.4 有一个 runtime/debug.WriteHeapDump 函数,它将堆中的所有对象以及其他信息(根、goroutine、终结器等)写入文件。此文件的格式在此处指定。
详细信息
该文件以字符串“go1.4 heap dump\n”的字节开头。
文件的其余部分是一系列记录。记录可以有几种不同的类型。记录将包含以下基本类型
- uvarint - 一个 64 位无符号整数,编码方式如 encoding/binary.{Put,Read}Uvarint 中所示
- 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 = 类型
- 4 = goroutine
- 5 = 堆栈帧
- 6 = 转储参数
- 7 = 已注册的终结器
- 8 = itab
- 9 = 操作系统线程
- 10 = 内存统计
- 11 = 排队的终结器
- 12 = 数据段
- 13 = bss 段
- 14 = defer 记录
- 15 = panic 记录
- 16 = 分配/释放配置文件记录
- 17 = 分配堆栈跟踪样本
每条记录的剩余字段与类型相关,如下所述。
EOF
EOF 记录没有字段,并且必须最后出现。
对象
- uvarint:对象的地址
- 字符串:对象的内容
- fieldlist:描述对象的包含指针的字段
内容字符串的大小是包含 sizeclass 的大小,而不是对象本身的大小。因此,内容大小可能比包含对象的类型大一些。
otherroot
- 字符串:此根来自何处的文本描述
- uvarint:根指针
类型
- uvarint:类型描述符的地址
- uvarint:此类型对象的尺寸
- 字符串:类型的名称
- 布尔值:包含此类型值的接口的数据字段是否为指针
goroutine (G)
- uvarint:描述符的地址
- uvarint:指向堆栈顶部的指针(当前运行的帧,又名深度 0)
- uvarint:go 例程 ID
- uvarint:创建此 goroutine 的 go 语句的位置
- uvarint:状态
- 布尔值:是否是由系统启动的 Go 例程
- 布尔值:是否为后台 Go 例程
- uvarint:go 例程上次开始等待的近似时间(自纪元以来的纳秒数)
- 字符串:它正在等待的文本原因
- uvarint:当前运行帧的上下文指针
- uvarint:操作系统线程描述符 (M) 的地址
- uvarint:顶部 defer 记录
- uvarint:顶部 panic 记录
可能的状态
- 0 = 空闲
- 1 = 可运行
- 3 = 系统调用
- 4 = 等待
等待字段必须始终存在,但只有在状态为“等待”时才有意义。
堆栈帧
- uvarint:堆栈指针(帧中的最低地址)
- uvarint:堆栈深度(0 = 堆栈顶部)
- uvarint:子帧的堆栈指针(如果没有,则为 0)
- string:堆栈帧的内容
- uvarint:函数的入口 pc
- uvarint:函数的当前 pc
- uvarint:函数的延续 pc(函数可能在任何地方恢复的地方)
- string:函数名称
- fieldlist:此帧中包含指针的字段的类型和偏移量的列表
转储参数
- bool:大端
- uvarint:以字节为单位的指针大小
- uvarint:堆的起始地址
- uvarint:堆的结束地址
- uvarint:thechar = 架构说明符
- 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 个 uvarint 转储。
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 的数据字段
- uvarint:指向当前正在运行的 defer 记录的指针
- uvarint:指向下一个 panic 记录的链接
分配/释放配置文件记录
- uvarint:记录标识符
- uvarint:已分配对象的尺寸
- uvarint:堆栈帧数。对于每个帧
-
- string:函数名称
-
- 字符串:文件名
-
- uvarint:行号
- uvarint:分配数
- uvarint:释放数
分配样本记录
- uvarint:对象的地址
- uvarint:分配/释放配置文件记录标识符
此内容是Go Wiki的一部分。