我正在编写一个自动分析系统,以便在我的应用程序中分析不同的GPU密集型屏幕。我一直试图使用'XCode Instruments',使用'OpenGL ES Driver'仪器来捕获gpu使用数据。
我的自动化系统从命令行运行Xcode Instruments,该命令行运行App,配置文件并捕获数据,并将数据写入“.trace”文件。
我现在希望能够打开跟踪文件,并使用我的自动分析系统读取跟踪数据,以便我可以通知App开发人员应用程序的各个部分如何执行。
但我找不到任何方法来读取跟踪文件。它似乎是包含各种目录的包,并且埋没在.zip文件中似乎包含一些二进制数据。如何解析此文件中的数据?
仪器系统似乎相当复杂,我很惊讶它访问它产生的跟踪数据有多难。
有谁知道如何解析跟踪文件?
我目前正在使用XCode 4.6.1
答案 0 :(得分:17)
好的,回答主要问题:.zip存档中的数据是使用NSArchiver
类序列化的数据blob(使用hex工具打开时,它们具有相当独特的标题(我用过hex fiend),这是第一个线索)。这是非常直接的阅读,所有你要做的就是打电话给NSUnarchiver
,至少这是理论。在进入细节之前,这是一个非常简单的示例应用程序,它会转储一些信息:https://github.com/JustSid/Traced
因此,NSArchiver
和NSUnarchiver
的问题在于,您首先需要拥有所有已归档的类,其次,您必须在命令,它被归档(这是一个棘手的位,我使用class-dump
转储一些所需的类的接口,然后尝试按对象解压缩数据对象,看看我得到的返回。幸运的是,NSArchiver
死于描述性错误消息,如果缺少一个类,它会告诉你它的名字是什么)。我遇到的最大问题是Instruments二进制文件和使用过的框架不包含我需要的所有类,特别是存档包含名为XRVideoCardRun
的类的序列化数据。我假设.template
包中的.trace
文件包含一个带有所需类的动态库(我的意思是,它的大小超过300kb并包含大量blob(它是btw二进制plist) )。我太懒了,无法从中提取二进制数据并对它运行class-dump
,我很幸运,从存档中得到的大部分数据与我期望为超类看到的数据一致,XRRun
(我在其中一个Instruments框架中找到),但包含字典的数组除外,其内容看起来像样本数据。
所以,其余的只是把所有东西组合在一起。如果您查看示例应用程序,最有趣的部分应该是XRRun.m
和.h
文件。它们包含一些文档,以及有关如何从示例中提取数据的一些内容,尽管您可能希望将其替换为您自己的逻辑以实现自动化。希望它有所帮助。
应用程序再次抛出您的示例文件输出:
Run 1, starting at 24.05.13 17:42:16, running until 24.05.13 17:42:28
Sample 0: FPS: 27 Device: 0% Renderer: 0% Tiler: 0% Timestamp: 1.012740
Sample 1: FPS: 35 Device: 11% Renderer: 10% Tiler: 2% Timestamp: 2.018574
Sample 2: FPS: 34 Device: 33% Renderer: 32% Tiler: 7% Timestamp: 3.026101
Sample 3: FPS: 59 Device: 59% Renderer: 59% Tiler: 16% Timestamp: 4.032030
Sample 4: FPS: 60 Device: 59% Renderer: 58% Tiler: 16% Timestamp: 5.038990
Sample 5: FPS: 59 Device: 59% Renderer: 58% Tiler: 16% Timestamp: 6.046022
Sample 6: FPS: 59 Device: 57% Renderer: 53% Tiler: 17% Timestamp: 7.051187
Sample 7: FPS: 60 Device: 67% Renderer: 66% Tiler: 14% Timestamp: 8.057343
Sample 8: FPS: 59 Device: 64% Renderer: 64% Tiler: 11% Timestamp: 9.064914
Sample 9: FPS: 60 Device: 67% Renderer: 67% Tiler: 11% Timestamp: 10.072592
Sample 10: FPS: 59 Device: 65% Renderer: 65% Tiler: 15% Timestamp: 11.080248
(PS:如果格式发生变化,应用程序也会中断...)
答案 1 :(得分:2)
我正在尝试使用Instruments本身附带的未记录的框架来解析.trace文档。它现在正在与Time Profiler一起工作,并且不难让它与其他仪器模板一起工作,并且需要更多的逆向工程工作。
您可以在/Applications/Xcode.app/Contents/Applications/Instruments.app/Contents/Frameworks
中看到,有很多与工具捆绑在一起的框架。
但是我们只需要反对这两个:
DVTInstrumentsFoundation.framework
InstrumentsPlugIn.framework
在开始之前你应该知道的另一件事是仪器模板实际上是/Applications/Xcode.app/Contents/Applications/Instruments.app/Contents/PlugIns
中的插件。
例如,SamplerPlugin.xrplugin
适用于Time Profiler。
答案 2 :(得分:0)
您可能无法使用脚本直接分析跟踪文件,但可以将它们导出为CSV文件,该文件可以通过脚本进行分析或放入Excel,Numbers等。您甚至可以添加作为CSV导出到自动测试,具体取决于它是如何完成的。
答案 3 :(得分:0)
.trace实际上是一个文件夹,它在.trace / instruments_data /中有一个zip 1.run.zip,在一些文件夹之后你会找到zip。解压缩它,你将获得1.run。不知道如何解码。最好的方法是调用 - instruments .trace - 这将在带有详细信息的工具中打开。