16

アプリでさまざまな GPU 集中型画面をプロファイリングするために、自動プロファイリング システムを作成しています。これには、GPU使用データをキャプチャする「OpenGL ES Driver」インストルメントとともに「XCode Instruments」を使用しようとしています。

私の自動化されたシステムは、アプリを実行し、データをプロファイリングしてキャプチャし、データを「.trace」ファイルに書き込むコマンドラインから Xcode Instruments を実行します。

トレース ファイルを開き、自動プロファイリング システムを使用してトレース データを読み取れるようにしたいと考えています。これにより、アプリのさまざまな部分がどのように実行されるかをアプリ開発者に知らせることができます。

ただし、トレース ファイルを読み取る方法が見つかりません。さまざまなディレクトリを含むパッケージのようで、バイナリ データを含むと思われる .zip ファイルが埋め込まれています。このファイルのデータはどのように解析されますか?

Instruments システムはかなり洗練されているように見えますが、それが生成するトレース データにアクセスするのが非常に難しいことに私は驚いています。

トレースファイルを解析する方法を知っている人はいますか?

現在、XCode 4.6.1 を使用しています

4

4 に答える 4

18

さて、主な質問に答えるために: .zip アーカイブ内のデータは、NSArchiverクラスでシリアル化されたデータの塊です (16 進ツール (私は 16 進フィーンドを使用しました) で開くと、かなり特徴的なヘッダーを持っているため、が最初の手がかりでした)。読むのはかなり簡単です。必要なのは を呼び出すことだけですNSUnarchiver。少なくともそれが理論です。詳細に入る前に、いくつかの情報をダンプする非常に単純なサンプル アプリを次に示します: https://github.com/JustSid/Traced

したがって、 、 、 の問題はNSArchiverNSUnarchiverまずアーカイブされたすべてのクラスを取得する必要があり、次にアーカイブされた順序でデータを読み取る必要があることです (これはトリッキーなビットでした。以前class-dumpは、必要なクラスのいくつかのインターフェイスをダンプしてから、データ オブジェクトをオブジェクトごとに展開して、返されたものを調べようとしましたが、幸いなことに、NSArchiver説明的なエラー メッセージが表示されて死にます。その名前は何ですか)。私が抱えていた最大の問題は、Instruments バイナリと使用されているフレームワークに必要なすべてのクラスが含まれていないことでした。特に、アーカイブには という名前のクラスのシリアル化されたデータが含まれていますXRVideoCardRun。私はその.template中のファイルが.tracebundle には、必要なクラスを含む動的ライブラリが含まれています (つまり、サイズが 300kb を超え、多くのブロブが含まれています (バイナリ plist です))。私は怠惰すぎて、そこからバイナリ データを抽出して実行することができませclass-dumpんでした。幸運にも、アーカイブから出てきたほとんどのデータは、スーパークラスに期待していたものと一致していましたXRRun(私が見つけたものです)。ただし、辞書を含む配列は例外で、その内容はサンプル データのように見えます。

だから、残りはすべてを組み合わせるだけでした。サンプル アプリを調べると、最も興味深い部分は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 と連携しており、もう少しリバース エンジニアリング作業を行うことで、他の計測器テンプレートと連携させることも難しくありません。

に見られるように、Instruments にバンドルされているかなりの数のフレームワークがあります/Applications/Xcode.app/Contents/Applications/Instruments.app/Contents/Frameworks

ただし、次の 2 つに対してのみリンクする必要があります。

  • DVTInstrumentsFoundation.framework
  • InstrumentsPlugIn.framework

開始する前に知っておくべきもう 1 つのことは、インストゥルメント テンプレートは実際には のプラグインであるということ/Applications/Xcode.app/Contents/Applications/Instruments.app/Contents/PlugInsです。

たとえば、SamplerPlugin.xrpluginTime Profiler 用です。

コードは短く、コメントアウトされています: https://github.com/Qusic/TraceUtility

于 2015-09-10T13:03:22.500 に答える
0

スクリプトを使用して Trace ファイルを直接分析することはできない場合がありますが、スクリプトで分析したり、Excel、Numbers などに挿入したりできる CSV ファイルにエクスポートすることはできます。実行方法に応じて、CSV を自動テストに追加します。

于 2013-05-24T14:58:06.533 に答える