背景: RTMP SDK需要获取硬编硬解时候的GPU数据,第一时间想起了TraceParser
, 但是TraceParser
不支持GPU Driver
模板. 于是想着能不能扩展TraceParser
模板. 发现main.m
文件只有寥寥几行代码,完全不知道做了什么, 但是google和km之后发现应该是采用了反序列化的方式来dump出数据. 缺点很明显, 需要自己实现NSCoding
,还需要先将.trace文件解压出.run文件. 不知道结构无从下手.
在 github 上发现有一种新的思路TraceUtility, 通过调用 Undocument API 去解析 Trace 文件.
下面结合 Hopper 分析Instruments
看看.
在逆向过程中发现打开文档用的是NSDocument
,-showTemplateChooser:
模板选择器. 这意味着一个trace文件是通过NSDocument
加上自定义文档类型(模板)来储存的, 当然这个文件类型并不会存在于MIME当中的.
在-initialize:
中对 Instruments 做了初始化, 包括一些链接 XCode 中 ShareFramework 的 Undocument 库.
在初始化完成之后,还有很重要的一步 —- 加载插件(PFTLoadPlugins()
), XCode 8之后, Instruments 的插件就从Plugins
文件夹下移到了Packages
文件下面, 并且用了新的打包方式,以.instrdst
扩展名结尾, 打开之后可以安装插件.如果不去安装, 在后面编码阶段发现是会抛除异常提示的. 相对的, 在-terminate:
里面有PFTClosePlugins()
. 基于以上条件, 可以直接通过调用接口来加载模板, 并且只有在加载了正确加载模板插件之后才能读入 Trace 文件.
在加载完 trace 文件之后就可以开始抽丝剥茧了.
根据这里的调试信息, 去 dump 出来的 instruments 头文件中搜索出需要的类, 放到自己的头文件当中, 成员变量的获取需要用到 runtime 特性.以我需要的 GPU 数据来说, 最后的层级关系如下:
123 | PFTDocuments > XRTrace > XRInstrument > XRRun > _data或PFTDocuments > XRTrace > XRInstrument >XRAnalysisCoreStandardController > XRContextContainer |
---|
最后在格式化输出就好了.
配合 Python 脚本可以直接输出成 Excel 的形式更加可观, 甚至可以自动化跑起来,每天直接输出邮件, 监控迭代性能表现.