DumpHprof 文件分析记录

源码解析

Posted by Mio4kon on 2018-03-23

dump 流程

fix header

  • java profile 版本
  • size of id: 写死的为4
  • 当前时间

当前 hprof remaining length (87133083)

string table

StartNewRecord(TAG,time) 主要作用如下:

该方法会写入三个值:

  • 写入 tag
  • 写入时间
  • 写入 length

写入之后会写入 id 以及对应 string 内容.

class table

可以发现在写入标注三值后会写入下面四个值:

  • class 的序列号,从 1 开始累加 //解析忽略
  • class 对象的 id, 使用对象结构的地址做为 id
  • stack trace 序列号,写死为0 //解析忽略
  • 类名字符串

stack traces

空数据,三个全是 0.
到此为止 header格式分析完了.

body

Roots

[/art/runtime/runtime.h]

方法声明:

[/art/runtime/runtime.cc]

对应实现如下:

[/art/runtime/thread_list.cc]

[/art/runtime/thread.cc]

可以发现中间的调用链非常长,我们这里只关心整个 hprof 文件的数据结构,这里面的 visitor其实就是我们的 Hprof 对象.最后都会调用下面的方法.

例如 HPROF_ROOT_THREAD_OBJECT 会存入下面四个内容:

  • heap_tag,也就是 HPROF_ROOT_THREAD_OBJECT 常量值
  • obj_id
  • thread_serial
  • stack_serial

其他所有的类型的同理.

未完待续..

附录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
enum HprofTag {
HPROF_TAG_STRING = 0x01,
HPROF_TAG_LOAD_CLASS = 0x02,
HPROF_TAG_UNLOAD_CLASS = 0x03,
HPROF_TAG_STACK_FRAME = 0x04,
HPROF_TAG_STACK_TRACE = 0x05,
HPROF_TAG_ALLOC_SITES = 0x06,
HPROF_TAG_HEAP_SUMMARY = 0x07,
HPROF_TAG_START_THREAD = 0x0A,
HPROF_TAG_END_THREAD = 0x0B,
HPROF_TAG_HEAP_DUMP = 0x0C,
HPROF_TAG_HEAP_DUMP_SEGMENT = 0x1C,
HPROF_TAG_HEAP_DUMP_END = 0x2C,
HPROF_TAG_CPU_SAMPLES = 0x0D,
HPROF_TAG_CONTROL_SETTINGS = 0x0E,
};