您的位置:首页 > 编程语言 > Go语言

google CPU Profiler 二进制数据文件格式

2011-09-13 20:33 309 查看
原文地址: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进行填充:

slotdata
0header count (0; must be 0)
1header slots after this one (3; must be >= 3)
2format version (0; must be 0)
3sampling period, in microseconds
4padding (0)
作为比较下面给以little-endian为例给出了32位和64位的表示方式:

hdr counthdr wordsversionsampling periodpad
32-bit or 64-bit (slots)030100000
32-bit (4-byte words in file)0x000000x000030x000000x027100x00000
64-bit LE (4-byte words in file)0x00000 0x000000x00003 0x000000x00000 0x000000x02710 0x000000x00000 0x00000
对于32位和64位的应用程序其binary header的slots值是不变了,profiler工具会自动检测文件内容,并根据头文件word field和
期望位置来判断是32位还是64位程序
数据记录(binary profile record)
record记录格式为:

slotdata
0sample count, must be >= 1
1number of call chain PCs (num_pcs), must be >= 1
2 .. (num_pcs + 1)call chain PCs, most-recently-called function first.
一个record的总长为2+num_pcs。一个profile工具可能会产生多个具有相同调用链的record,在这种情况下分析工具应该能够统计
出具有相同调用链的record总数
注意:当遇到调用栈的入口地址为0时,某些分析工具会自动中断
e.g. 5 3 0xa0000 0xc0000 0xe0000
本例中在PC 0xa0000处采样5次,0xa0000被0xc0000调用,0xc0000被0xe0000调用
文件尾部(binary trailer)
trailer包含3个slot,并具有固定的值

slotvalue
00
11
20
可以理解为采用了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替换
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐