16

我正在编写一个自动分析系统,以在我的应用程序中分析不同的 GPU 密集型屏幕。我一直在尝试为此使用“XCode Instruments”,并使用“OpenGL ES Driver”工具来捕获 gpu 使用数据。

我的自动化系统从命令行运行 Xcode Instruments,该命令行运行应用程序、配置文件和捕获数据,并将数据写入“.trace”文件。

我现在希望能够打开跟踪文件,并使用我的自动分析系统读取跟踪数据,以便我可以告知应用程序开发人员应用程序各个部分的执行情况。

但是,我找不到任何读取跟踪文件的方法。它似乎是包含各种目录的包,并且埋有一个似乎包含一些二进制数据的 .zip 文件。这个文件中的数据是如何解析的?

Instruments 系统似乎相当复杂,我很惊讶访问它产生的跟踪数据有多么困难。

有谁知道如何解析跟踪文件?

我目前正在使用 XCode 4.6.1

4

4 回答 4

18

好的,所以回答主要问题:.zip 存档中的数据是一个用NSArchiver类序列化的数据块(当使用 hex 工具(我使用 hex fiend)打开它们时,它们有一个相当独特的标题,所以是第一个线索)。阅读起来相当简单,您所要做的就是打电话给NSUnarchiver,至少理论上是这样的。在详细介绍之前,这是一个非常简单的示例应用程序,它转储了一些信息:https ://github.com/JustSid/Traced

因此, 和 的问题NSArchiver在于NSUnarchiver,首先您需要拥有所有已存档的类,其次您必须按照存档的顺序读取数据(这是棘手的一点,我曾经class-dump为一些必需的类转储接口,然后尝试逐个对象取消归档数据对象并查看我返回的内容。幸运的是,NSArchiver死于描述性错误消息,如果缺少一个类,它会告诉你它叫什么名字)。我遇到的最大问题是 Instruments 二进制文件和使用的框架不包含我需要的所有类,特别是存档包含名为XRVideoCardRun. 我假设.template里面的文件.tracebundle 包含一个带有所需类的动态库(我的意思是,它的大小超过 300kb 并且包含很多 blob(它是二进制 plist))。我懒得从中提取二进制数据并运行class-dump它,我很幸运,从档案中出来的大部分数据与我期望看到的超类一致,XRRun(我发现在其中一个 Instruments 框架中),但包含字典的数组除外,其内容看起来像示例数据。

所以,剩下的就是把所有东西结合在一起。如果您查看示例应用程序,最有趣的部分应该是XRRun.mand.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:如果格式改变,应用程序也会崩溃......)

于 2013-05-24T21:15:13.060 回答
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用于时间探查器。

代码很短,注释掉了:https ://github.com/Qusic/TraceUtility

于 2015-09-10T13:03:22.500 回答
0

您可能无法直接使用脚本分析 Trace 文件,但可以将它们导出为 CSV 文件,该文件可以通过脚本进行分析或放入 Excel、Numbers 等。您甚至可以将导出添加为CSV 到您的自动化测试中,具体取决于它是如何完成的。

于 2013-05-24T14:58:06.533 回答
0

.trace 实际上是一个文件夹,它在 .trace/instruments_data/ 中有一个 zip 1.run.zip,在一些文件夹之后您会找到该 zip。解压它,你会得到 1.run。不知道如何解码。最好的方法是调用 -instruments .trace - 这将在带有详细信息的工具中打开。

于 2014-04-03T12:57:28.973 回答