2013-05-24 12 views
11

Sto scrivendo un sistema di profilazione automatizzata, per profilare diversi schermi intensivi della GPU nella mia app. Ho cercato di utilizzare "XCode Instruments" per questo, con lo strumento "OpenGL ES Driver" che cattura i dati di utilizzo della GPU.Cercando di leggere un file .trace di Xcode Instruments. Qual è il formato del file di un file .trace?

Il mio sistema automatizzato esegue Xcode Instruments dalla riga di comando che esegue l'app, i profili e acquisisce i dati e scrive i dati in un file ".trace".

Ora desidero essere in grado di aprire il file di traccia e leggere i dati di traccia utilizzando il mio sistema di profilatura automatica, in modo da poter informare gli sviluppatori di app su come funzionano le varie parti dell'App.

Non riesco tuttavia a trovare alcun modo di leggere il file di traccia. Sembra essere un pacchetto che contiene varie directory e, seppellito, c'è un file .zip che sembra contenere alcuni dati binari. Come vengono analizzati i dati in questo file?

Il sistema di strumenti sembra abbastanza sososimile, e sono stato sorpreso di quanto sia stato difficile accedere ai dati di traccia che produce.

Qualcuno sa come analizzare il file di traccia?

Attualmente sto usando XCode 4.6.1

+0

Potrebbe caricare un file di traccia esempio? – JustSid

+0

Ho messo un file di traccia di esempio qui, grazie [collegamento] (https://dl.dropboxusercontent.com/u/28978817/Instruments.trace.zip) – georgeparrish

+0

Grazie, guarderò a questa sera (non promette però , le mie capacità di reverse engineer sono limitate al massimo) – JustSid

risposta

14

OK, quindi per rispondere alla domanda principale: i dati nell'archivio .zip sono una serie di dati serializzati con la classe NSArchiver (hanno un'intestazione piuttosto distintiva quando vengono aperti con uno strumento esadecimale (io ho usato l'esadecimale diavolo), quindi quello fu il primo indizio). È abbastanza semplice da leggere, tutto ciò che devi fare è effettuare una chiamata a NSUnarchiver, almeno questa è la teoria. Prima di andare in nei dettagli, ecco un esempio molto semplice applicazione che scarica un paio di informazioni: https://github.com/JustSid/Traced

Quindi, il problema con NSArchiver e NSUnarchiver, è che prima di tutto bisogno di avere tutte le classi che erano archiviato, e in secondo luogo devi leggere i dati nell'ordine in cui è stato archiviato (era un po 'complicato, ho usato class-dump per fare il dump dell'interfaccia per alcune delle classi richieste e poi ho provato ad annullare l'archiviazione dell'oggetto dati per oggetto e guardando quello che mi è stato restituito. Fortunatamente, NSArchiver muore con messaggi di errore descrittivi, se manca una classe, ti dirà qual è il suo nome). Il problema più grande che ho avuto è stato il fatto che il binario di Instruments e i framework utilizzati non contengono tutte le classi di cui avevo bisogno, in particolare l'archivio contiene i dati serializzati di una classe denominata XRVideoCardRun. Ho il presupposto che il file all'interno del pacchetto contenga una libreria dinamica con la classe richiesta (voglio dire, ha una dimensione di oltre 300kb e contiene un sacco di blob (è una compilazione binaria)). Ero troppo pigro per estrarre i dati binari da esso ed eseguire class-dump contro di esso, e ho avuto la fortuna che la maggior parte dei dati usciti dall'archivio fosse coerente con quello che mi aspettavo di vedere per la superclasse, XRRun (che Ho trovato in uno dei framework di Instruments), con l'eccezione di un array contenente dizionari, che sembrava il contenuto dei dati di esempio.

Quindi, il resto era solo combinando tutto insieme. Se si guarda nell'app di esempio, la parte più interessante dovrebbe essere il file XRRun.m e .h.Contengono un po 'di documentazione e alcuni pezzi su come estrarre i dati dagli esempi, anche se probabilmente vorrai sostituirli con la tua logica per la tua automazione. Spero che sia d'aiuto.

L'applicazione gettati agains vostri output file di esempio questo:

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: Se le modifiche di formato, l'applicazione si romperà così ...)

+0

Lavoro fantastico Sid :) Ho intenzione di provare a lavorare attraverso il processo che descrivi per decodificare i dati, in modo che possa farlo di nuovo se c'è un cambiamento di formato. Ho anche intenzione di presentare una richiesta di funzionalità con Apple per chiedere una migliore opzione di esportazione dei dati di traccia su OpenGLES Driver Instrument. Grazie ancora, George – georgeparrish

+0

@georgeparrish Sei il benvenuto! Sentiti libero di chiedere se hai qualche domanda! (A proposito, se questo ha risposto alla tua domanda, puoi accettarla come risposta corretta facendo clic sul segno di spunta grigio accanto ad essa) – JustSid

+0

Quale interfaccia sarà per la profilatura della CPU o della memoria? Dove hai trovato XRVideoCardRun? – Krzysiek

-1

Potrebbe non essere in grado di analizzare il file di traccia direttamente con uno script, ma possono esportati in un file CSV che può essere analizzato da uno script o messa in Excel , Numeri, ecc. Potresti anche essere in grado di aggiungere l'esportazione come CSV ai test automatici, a seconda di come è fatto.

+1

-1 La domanda è su come analizzare personalmente i dati – JustSid

+0

Non voglio essere in grado di visualizzare la vista Traccia usando gli strumenti. Voglio essere in grado di leggere il file in modo programmatico (ad esempio utilizzando uno script di shell) in modo da poter elaborare automaticamente i dati. L'intenzione è che il mio sistema di profili automatizzato possa pubblicare i risultati dei dati del profilo su una wiki in modo che gli altri sviluppatori possano vedere questi risultati a colpo d'occhio, quando l'app funziona lentamente. – georgeparrish

+0

L'unico modo per analizzarlo a livello di programmazione è anche scrivere uno script personalizzato per farlo ed è un processo molto complicato. Consiglio vivamente di trovare un modo diverso per farlo. – charleyh

0

.trace è in realtà una cartella e ha una zip 1.run.zip in .trace/instruments_data/e dopo alcune cartelle troverai lo zip. Decomprimilo e otterrai 1.run. Non sei sicuro di come decodificarlo. Il modo migliore è chiamare - strumenti .trace - questo si aprirà negli strumenti con i dettagli.

1

Sto cercando di analizzare il documento .trace utilizzando i framework non documentati forniti con Instruments. Ora sta lavorando con Time Profiler e non dovrebbe essere difficile farlo funzionare anche con altri modelli di strumenti, con un po 'di lavoro di reverse engineering.

Ci sono alcuni framework in bundle con gli strumenti, come potete vedere in /Applications/Xcode.app/Contents/Applications/Instruments.app/Contents/Frameworks.

Tuttavia abbiamo solo bisogno di collegare contro questi due:

  • DVTInstrumentsFoundation.framework
  • InstrumentsPlugIn.framework

Un'altra cosa che si deve sapere prima di partenza è che i modelli sono in realtà strumenti plug-in /Applications/Xcode.app/Contents/Applications/Instruments.app/Contents/PlugIns.

Ad esempio, SamplerPlugin.xrplugin è per Time Profiler.

Il codice è breve e commentata: https://github.com/Qusic/TraceUtility

Problemi correlati