iOS instruments trace文件解析方案

简介:

前言

    已很少写文章,不过这次感觉有必要写一下。因为:

    1. 这个方案通过debug逆向得来,很有参考意义。

    2. iOS这方面资料非常少,做这块时,无论国内外,翻遍了google,baidu都没太多合适的资料。

    故此,我觉得把整个流程记录下来,你可以认为这是一次iOS instruments的debug之旅。

 

问题起因

    最近做iOS性能测试,要监控一段时间内App的CPU占用和网络流量。遗憾的是,iOS instruments提供的Activity Monitor和Network模板并不满足我的需求。在UI工具中,Activity Monitor只提供了CPU瞬时值,Network也只提供了总流量,它们均不提供采集样本值。

 

    由于iOS闭源,放出的资料又少,故解决此问题的方案屈指可数:

    (1). 设备越狱,通过后台守护进程采集数据。

        - 缺陷:新设备无法越狱。

    (2). 在产品中嵌入性能数据采集模块。

        - 缺陷:我不倾向在产品中嵌入测试模块;另外,该方案对第三方产品也失效。

    (3). 从instruments结果文件(.trace)中尝试获取样本值。

        - 缺陷:能不能做都不知道…

    因方案1,2有硬伤,故选方案3尝试。

 

    其实,我开始时也并不确定trace文件包含样本数据,但instruments可通过trace文件恢复监控过程的柱状图,它给了我继续这个方向的信心。

    3KYW

 

     而从trace文件获取样本值,有2个方向:

     (1)分析trace结构,获取明文数据

          - trace其实是文件夹,但里面文件内容均为二进制,遂放弃......

     (2)通过Undocumented API解析trace文件

          - 由于instruments可以解析trace文件,那么(2)方法是一定可行的,问题是怎么找到相关的Undocumented API。

 

Undocumented API可行性确认

     Lucky,我同事发现了这玩意:TraceUtility,它一个是获取Time Profiler样本值的工具(那作者也和我一样遇到这种蛋疼问题......),并且Readme中找到重要线索:

     (1)所需的Undocumented API在/Applications/Xcode.app/Contents/Applications/Instruments.app/Contents/Frameworks:

          DVTInstrumentsFoundation.framework

          InstrumentsPlugIn.framework

     (2)Instruments模板以PlugIns形式存在于

          /Applications/Xcode.app/Contents/Applications/Instruments.app/Contents/PlugIns

 

TraceUtility源码分析

    项目就2个文件:

        InstrumentsPrivateHeader.h: Undocumented API和Undocumented数据结构声明。

        main.m:样本数据提取主流程。

2016-03-28_114938

 

深入Debug分析

     然而TraceUtility仅用于获取Time Profiler样本数据,并不能满足我获取CPU和网络流量样本的要求。

     我需要解决的问题是:

     (1)确定instruments处理类。

     (2)从处理类中读出样本数据。

 

     1. 确定instruments处理类

     方式很简单,在loadDocument后,debug变量trace._baseInstruments

     E7I](3$)BP$K`K_XIIH6J77

     QQ图片20160328115512

    对比图1、2,XRSamplerInstrument=>XRSamplerRun,XRActivityInstrument=>XRActivityRun?,XRNetworkingInstrument=>XRNetworkingRun?;

    在另一个github项目class-dump-o-tron, 搜到了相关信息:XRSamplerRun.h,然而在ActivityPlugin.xrplugin下却没找到XRActivityRun.h,而是XRActivityInstrumentRun.h(大Apple的命名能统一点嘛……);在XRNetworkingPlugIn.xrplugin下,找到了XRNetworkingRun.h

 

     2. 读取trace样本数据

    (1)CPU样本结果

        debug变量run._data,发现了样本数据

        N6ZL_F0OBPF9`4SHJH3G~)6

        TraceUtility使用了Undocumented API获取数据,而我在XRActivityInstrumentRun.h没找到相关API,直接通过反射获取吧。

        C59E220C-72B7-4C37-BE9A-C694A3025E66

        至此,CPU样本数据获取完成。

 

    (2)网络流量样本结果

    Y3GL1%)C3@72RR]E]00`Z52

    XRNetworkRun和XRActivityInstrumentRun对象属性不一样,没有_data,但_saveActivityQueries中有段sql,初步预估这玩意用了localdb,但db类型未明。另外,估计_saveInstrumentUUID应该db文件。

    然后cat 2A183EAD-5B9C-45DD-B2BA-D63DCD1165D4看下,因为文件可能会在头部加注类型信息,cat结果如下:

    X{2N8}OH$%VCG$F)`FBS9{6

    捕获SQLite文件一个……接下来的事情就是分析表结构了,没什么难度,不作详述了。至此,网络流量样本数据获取完成。

 

--------------------我是一条的分割线--------------------

 

补充部分-20160424

  关于以上代码,我的实施是在xcode7.2上,但到了xcode7.3,出现些坑爹问题:

  在调用PFTLoadPlugins时候,出现crash,如下:

  意思是,在xcode7.3后,PFTLoadPlugins()调用了applicationDirectoryName,但在调用applicationDirectoryName前,必须先调用initializeApplicationDirectoryName。而PFTLoadPlugins没有帮我们做init,所以呢,crash了!!!

  解决方案:自己动手调用.....

  (1)加载DVTFramework。

    位置:/Applications/Xcode.app/Contents/SharedFrameworks

    原因:initializeApplicationDirectoryName在该库中...

  (2)在.h文件增加

    @interface DVTDeveloperPaths : NSObject
+ (void)initializeApplicationDirectoryName:(id)arg1;
@end

  (3)在main.m中,PFTLoadPlugins()前增加:

    id test = @"../../../../../../../Applications/Xcode.app/";
[DVTDeveloperPaths initializeApplicationDirectoryName:test];

  完成以上步骤后,PFTLoadPlugins()可以正常执行!



本文转自hyddd博客园博客,原文链接:http://www.cnblogs.com/hyddd/p/5329608.html,如需转载请自行联系原作者。


目录
相关文章
|
5月前
|
数据可视化 前端开发 测试技术
接口测试新选择:Postman替代方案全解析
在软件开发中,接口测试工具至关重要。Postman长期占据主导地位,但随着国产工具的崛起,越来越多开发者转向更适合中国市场的替代方案——Apifox。它不仅支持中英文切换、完全免费不限人数,还具备强大的可视化操作、自动生成文档和API调试功能,极大简化了开发流程。
|
7月前
|
Java 开发工具 Android开发
Android与iOS开发环境搭建全解析####
本文深入探讨了Android与iOS两大移动操作系统的开发环境搭建流程,旨在为初学者及有一定基础的开发者提供详尽指南。我们将从开发工具的选择、环境配置到第一个简单应用的创建,一步步引导读者步入移动应用开发的殿堂。无论你是Android Studio的新手还是Xcode的探索者,本文都将为你扫清开发道路上的障碍,助你快速上手并享受跨平台移动开发的乐趣。 ####
|
6月前
|
人工智能 自然语言处理 Java
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
FastExcel 是一款基于 Java 的高性能 Excel 处理工具,专注于优化大规模数据处理,提供简洁易用的 API 和流式操作能力,支持从 EasyExcel 无缝迁移。
1284 65
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
|
4月前
|
机器学习/深度学习 人工智能 自然语言处理
企业级API集成方案:基于阿里云函数计算调用DeepSeek全解析
DeepSeek R1 是一款先进的大规模深度学习模型,专为自然语言处理等复杂任务设计。它具备高效的架构、强大的泛化能力和优化的参数管理,适用于文本生成、智能问答、代码生成和数据分析等领域。阿里云平台提供了高性能计算资源、合规与数据安全、低延迟覆盖和成本效益等优势,支持用户便捷部署和调用 DeepSeek R1 模型,确保快速响应和稳定服务。通过阿里云百炼模型服务,用户可以轻松体验满血版 DeepSeek R1,并享受免费试用和灵活的API调用方式。
355 12
|
4月前
|
Java API 数据处理
深潜数据海洋:Java文件读写全面解析与实战指南
通过本文的详细解析与实战示例,您可以系统地掌握Java中各种文件读写操作,从基本的读写到高效的NIO操作,再到文件复制、移动和删除。希望这些内容能够帮助您在实际项目中处理文件数据,提高开发效率和代码质量。
107 4
|
4月前
|
存储 人工智能 并行计算
2025年阿里云弹性裸金属服务器架构解析与资源配置方案
🚀 核心特性与技术创新:提供100%物理机性能输出,支持NVIDIA A100/V100 GPU直通,无虚拟化层损耗。网络与存储优化,400万PPS吞吐量,ESSD云盘IOPS达100万,RDMA延迟<5μs。全球部署覆盖华北、华东、华南及海外节点,支持跨地域负载均衡。典型应用场景包括AI训练、科学计算等,支持分布式训练和并行计算框架。弹性裸金属服务器+OSS存储+高速网络综合部署,满足高性能计算需求。
|
5月前
|
机器学习/深度学习 传感器 人工智能
穹彻智能-上交大最新Nature子刊速递:解析深度学习驱动的视触觉动态重建方案
上海交大研究团队在Nature子刊发表论文,提出基于深度学习的视触觉动态重建方案,结合高密度可拉伸触觉手套与视觉-触觉联合学习框架,实现手部与物体间力量型交互的实时捕捉和重建。该方案包含1152个触觉感知单元,通过应变干扰抑制方法提高测量准确性,平均重建误差仅1.8厘米。实验结果显示,其在物体重建的准确性和鲁棒性方面优于现有方法,为虚拟现实、远程医疗等领域带来新突破。
132 32
|
5月前
|
Serverless 对象存储 人工智能
智能文件解析:体验阿里云多模态信息提取解决方案
在当今数据驱动的时代,信息的获取和处理效率直接影响着企业决策的速度和质量。然而,面对日益多样化的文件格式(文本、图像、音频、视频),传统的处理方法显然已经无法满足需求。
217 4
智能文件解析:体验阿里云多模态信息提取解决方案
|
6月前
|
Java 调度 Android开发
安卓与iOS开发中的线程管理差异解析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自拥有独特的魅力。如同东西方文化的差异,它们在处理多线程任务时也展现出不同的哲学。本文将带你穿梭于这两个平台之间,比较它们在线程管理上的核心理念、实现方式及性能考量,助你成为跨平台的编程高手。
|
6月前
|
存储 安全 数据安全/隐私保护
深入解析iOS 14隐私保护功能:用户数据安全的新里程碑
随着数字时代的到来,个人隐私保护成为全球关注的焦点。苹果公司在最新的iOS 14系统中引入了一系列创新的隐私保护功能,旨在为用户提供更透明的数据使用信息和更强的控制权。本文将深入探讨iOS 14中的几项关键隐私功能,包括App跟踪透明性、简化的隐私设置以及增强的系统安全性,分析它们如何共同作用以提升用户的隐私保护水平。
395 3

推荐镜像

更多
  • DNS