原文地址:http://google-perftools.googlecode.com/svn/trunk/doc/cpuprofile-fileformat.html
本文主要是对CPU Profiler工具产生的二进制数据文件进行的说明。源代码位于下载的profiler源文件包的src/profiler.cc中。
CPU Profile 的数据文件结构
每个profile数据文件包含四部分:
文件头部,profile 记录, 文件尾部,映射对象列表
二进制数据以名为slots的术语表示,对于32位应用程序slots为4bytes,对于64位应用程序slots则为8bytes。数据在文件中存储的方式则为
本地二进制顺序(big-endian 或者 little-endian)
文件头部(binary header)
下面是文件头部的结构定义,由profiler进行填充:
slot | data |
---|---|
0 | header count (0; must be 0) |
1 | header slots after this one (3; must be >= 3) |
2 | format version (0; must be 0) |
3 | sampling period, in microseconds |
4 | padding (0) |
作为比较下面给以little-endian为例给出了32位和64位的表示方式:
hdr count | hdr words | version | sampling period | pad | |
---|---|---|---|---|---|
32-bit or 64-bit (slots) | 0 | 3 | 0 | 10000 | 0 |
32-bit (4-byte words in file) | 0x00000 | 0x00003 | 0x00000 | 0x02710 | 0x00000 |
64-bit LE (4-byte words in file) | 0x00000 0x00000 | 0x00003 0x00000 | 0x00000 0x00000 | 0x02710 0x00000 | 0x00000 0x00000 |
对于32位和64位的应用程序其binary header的slots值是不变了,profiler工具会自动检测文件内容,并根据头文件word field和
期望位置来判断是32位还是64位程序
数据记录(binary profile record)
record记录格式为:
slot | data |
---|---|
0 | sample count, must be >= 1 |
1 | number of call chain PCs (num_pcs), must be >= 1 |
2 .. (num_pcs + 1) | call chain PCs, most-recently-called function first. |
出具有相同调用链的record总数
注意:当遇到调用栈的入口地址为0时,某些分析工具会自动中断
e.g. 5 3 0xa0000 0xc0000 0xe0000
本例中在PC 0xa0000处采样5次,0xa0000被0xc0000调用,0xc0000被0xe0000调用
文件尾部(binary trailer)
trailer包含3个slot,并具有固定的值
slot | value |
---|---|
0 | 0 |
1 | 1 |
2 | 0 |
可以理解为采用了0次,调用长度为1,调用起始地址为0
映射对象列表(list of mapped objects)
紧接着trailer文件由一系列的映像对象组成,这些对象是一些由换行符分割的文本对象
每一行是下列两种格式中的一种:
Build specifier, 以"build="作为开端.
e.g. build=/path/to/binary
Mapping line from ProcMapsIterator::FormatLine.
e.g. 40000000-40015000 r-xp 00000000 03:01 12845071 /lib/ld-2.3.2.so
无法识别行则会被自动忽略掉
当处理mapping line时如果出现了$build后面跟着非字符和下划线的字符,则会被最后一个build specifier替换