【问题标题】:Trying to read a Xcode Instruments .trace file. What is the file format of a .trace file?试图读取 Xcode Instruments 的 .trace 文件。 .trace 文件的文件格式是什么?
【发布时间】:2013-05-20 05:04:35
【问题描述】:

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

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

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

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

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

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

我目前正在使用 XCode 4.6.1

【问题讨论】:

  • 你能上传一个示例跟踪文件吗?
  • 我在这里放了一个示例跟踪文件,谢谢link
  • 谢谢,今晚我会调查一下(不过没有保证,我的逆向工程师技能充其量是有限的)
  • 谢谢,感谢您的努力

标签: iphone ios xcode opengl-es instruments


【解决方案1】:

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

所以,NSArchiverNSUnarchiver 的问题在于,首先您需要拥有所有已归档的类,其次您必须按顺序读取数据已存档(这是一个棘手的问题,我使用class-dump 转储了一些所需类的接口,然后尝试逐个对象取消存档数据对象并查看我返回的内容。幸运的是,NSArchiver 死于描述性错误消息,如果缺少一个类,它会告诉你它的名字是什么)。我遇到的最大问题是 Instruments 二进制文件和使用的框架不包含我需要的所有类,特别是存档包含名为 XRVideoCardRun 的类的序列化数据。我假设.trace 包内的.template 文件包含一个具有所需类的动态库(我的意思是,它的大小超过300kb 并且包含很多blob(它是二进制plist))。我懒得从中提取二进制数据并对其运行class-dump,而且我很幸运,从档案中出来的大部分数据与我期望看到的超类一致,@ 987654332@(我在其中一个 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:如果格式改变,应用也会崩溃……)

【讨论】:

  • 很棒的工作 Sid :) 我将尝试完成您描述的用于解码数据的过程,以便在格式更改时我可以再次执行此操作。我还将向 Apple 提出功能请求,要求在 OpenGLES Driver Instrument 上提供更好的跟踪数据导出选项。再次感谢,乔治
  • @georgeparrish 欢迎您!如果您有任何问题,请随时提问! (顺便说一句,如果这回答了您的问题,您可以通过单击旁边的灰色复选标记将其作为正确答案接受)
  • 什么接口用于分析 CPU 或内存?您在哪里找到 XRVideoCardRun?
  • 这几天我也在做一些追踪文件的研究,偶然发现了你的帖子。我尝试使用 Instruments 本身的框架,稍后我将在单独的答案中发布我的进展。
【解决方案2】:

我正在尝试使用 Instruments 本身附带的未记录框架来解析 .trace 文档。它现在可以与 Time Profiler 一起使用,并且应该不难让它与其他仪器模板一起使用,只需进行更多的逆向工程工作。

您可以在 /Applications/Xcode.app/Contents/Applications/Instruments.app/Contents/Frameworks 中看到很多与 Instruments 捆绑在一起的框架。

但是我们只需要链接这两个:

  • DVTInstrumentsFoundation.framework
  • InstrumentsPlugIn.framework

在开始之前您应该知道的另一件事是乐器模板实际上是/Applications/Xcode.app/Contents/Applications/Instruments.app/Contents/PlugIns 中的插件。

例如,SamplerPlugin.xrplugin 用于 Time Profiler。

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 我不想使用仪器查看 Trace 视图。我希望能够以编程方式读取文件(例如使用 shell 脚本),以便我可以自动处理数据。目的是我的自动化配置文件系统可以将配置文件数据结果发布到 wiki 上,以便其他开发人员在应用程序运行缓慢时可以一目了然地看到这些结果。
    • 以编程方式解析它的唯一方法是编写自定义脚本来执行此操作,这是一个非常复杂的过程。我强烈建议您找到一种不同的方法来做到这一点。
    • 你好,glenwayguy。我很高兴编写自定义脚本(这是我的工作),我只需要知道文件的格式,你知道我在哪里可以找到格式吗?感谢您的回复
    • 我不确定您是否可以直接处理跟踪文件,但是,您可以让仪器将它们导出为 CSV,以便通过脚本进行分析。您甚至可以将导出添加到您的自动化测试工作流程中,这样您就可以立即让脚本对其进行处理。
    • 我尝试在 Instruments 程序中导出数据。 'OpenGL ES Driver' 工具的菜单选项被禁用。据我了解,并非所有仪器都支持导出。除非有某种方法可以从命令行使用 Instruments 导出数据,但我也没有找到如何做到这一点:(
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-31
      • 2012-07-28
      • 1970-01-01
      • 2021-08-31
      • 1970-01-01
      • 2020-01-13
      • 2016-02-12
      • 2023-03-03
      相关资源
      最近更新 更多