• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • iOS instruments trace 文件解析方案

    發表于:2016-05-11來源:測試窩作者:testerhome點擊數: 標簽:iOS
    在 iOS 上做性能測試,Instruments 是必不可少的工具。然而由于蘋果的封閉性,我們很難根據自己項目實際需要去修改它來獲取自己想要的數據。

      在 iOS 上做性能測試,Instruments 是必不可少的工具。然而由于蘋果的封閉性,我們很難根據自己項目實際需要去修改它來獲取自己想要的數據。

      hyddd 通過自己的探索,找到了一條能獲取一段時間內 App 的 CPU 占用和網絡流量的路,并把自己探索的過程無私分享出來,填補了 iOS 自定義性能測試的一個空白,十分值得學習~

      前言

      已很少寫文章,不過這次感覺有必要寫一下。因為:

      1. 這個方案通過debug逆向得來,很有參考意義。

      2. iOS這方面資料非常少,做這塊時,無論國內外,翻遍了google,baidu都沒太多合適的資料。

      故此,我覺得把整個流程記錄下來,你可以認為,這是一次iOS的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文件恢復監控過程的柱狀圖,它給了我繼續這個方向的信心。

      而從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:樣本數據提取主流程。

      深入Debug分析

      然而TraceUtility僅用于獲取Time Profiler樣本數據,并不能滿足我獲取CPU和網絡流量樣本的要求。

      我需要解決的問題是:

      (1)確定instruments處理類。

      (2)從處理類中讀出樣本數據。

      1. 確定instruments處理類

      方式很簡單,在loadDocument后,debug變量trace._baseInstruments

      對比圖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;

      即最終對應關系:

      XRSamplerInstrument=>XRSamplerRun

      XRActivityInstrument=>XRActivityInstrumentRun

      XRNetworkingInstrument=>XRNetworkingRun

      2. 讀取trace樣本數據

      (1)CPU樣本結果

      debug變量run._data,發現了樣本數據

    原文轉自:http://www.testwo.com/article/654

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>