2011-08-28 9 views
6

Questo tizio ha creato uno strumento abbastanza accurato per generare un grafico di dipendenza classe, tuttavia, si basa sull'analisi del codice sorgente e sulla ricerca delle direttive #import.Utilizzo di metadati Objective-C per generare il grafico di dipendenza della classe

Questo è pulito, ma ho un certo numero di problemi con questo. Non ultimo, non prende in considerazione le importazioni di importazioni né le intestazioni dei prefissi né se le classi o le classi nel file a cui fa riferimento l'importazione siano effettivamente utilizzate.

Mi piacerebbe fare qualcosa di più simile a class-dump ed esaminare i metadati Objective-C memorizzati nel file Mach-O per generare una rappresentazione in memoria delle dipendenze di classe.

preferisco non fare questo da zero, quindi mi chiedo:

  • Ha già stato fatto?
  • Esiste una libreria open source che mi fornisce gli strumenti di base di cui ho bisogno per estrarre queste informazioni (una libreria che esamina il file Mach-O e crea una facciata delle informazioni Objective-C contenute all'interno - tale che io potrebbe scorrere su tutte le classi, i loro metodi, proprietà, ivars, ecc. e cercare i riferimenti ad altre classi). Immagino che la fonte del dump di classe sarebbe un buon punto di partenza.
  • Se hai esperienza in questo genere di cose, è ciò che sto cercando di realizzare?
  • Quali ostacoli devo superare?

risposta

3

È già stato eseguito?

Non che io sappia.

Esiste una libreria open source che mi fornirà gli strumenti di base necessari per estrarre queste informazioni?

Al centro del class-dump è libMachObjC che non ricade perfettamente ciò che si vuole, cioè parse tutte le classi/metodi/Ivars e molto altro ancora. L'API è molto pulita, dovrebbe essere molto facile da usare.

Se si ha esperienza in questo genere di cose, è quello che sto cercando di rendere possibile il ?

Sfortunatamente, no perché alcune classi non dichiarano la classe reale ma usano invece id. Per esempio, ecco è l'informazione che può essere estratta da una classe-discarica di UIKit:

@interface UITableView : UIScrollView <NSCoding> 
{ 
    int _style; 
    id <UITableViewDataSource> _dataSource; 
    id _rowData; 
    ... 

Le informazioni di tipo _rowData Ivar è id ma se controlli in fase di esecuzione vedrete che _rowData è un'istanza della UITableViewRowData classe. Questa informazione non è presente nel binario di Mach-O, quindi non hai modo di trovare la relazione tra UITableView e UITableViewRowData. Lo stesso vale per i parametri del metodo.

+0

Grazie per la risposta! Capisco il problema 'id'. Tuttavia, esiste una delle due possibilità: ** A.) ** La classe effettiva utilizzata per '_rowData' non è in realtà una dipendenza della classe di esempio. * o * ** B.) ** La classe effettiva utilizzata per '_rowData' è riferita a uno dei metodi della tua classe di esempio - nel qual caso, la scansione del contenuto di tutti i metodi mi permetterebbe di trovare tale dipendenza. – Steve

1

È già stato fatto?

sì - ma non posso consigliare un buon implementazione pubblica

C'è una libreria open-source che mi avrebbe fornito gli strumenti fondamentali che ho bisogno di estrarre queste informazioni (una libreria che esamina il file Mach-O e crea una facciata delle informazioni Objective-C contenute all'interno - in modo tale da poter scorrere tutte le classi, i loro metodi, proprietà, ivars, ecc. e scansionare i riferimenti ad altre classi) I figure class-dump's la fonte sarebbe un buon punto di partenza.

la maggior parte dei casi di utilizzo trarrebbe vantaggio dall'utilizzo delle funzioni di runtime objc objc/... anziché dall'esame del binario.

Se avete esperienza in questo genere di cose, è ciò che sto cercando di realizzare?

sì. ho fatto qualcosa di simile usando il runtime objc.

Quali ostacoli devo superare?

che dipende in gran parte dal livello di dettaglio che si desidera ...tempo di implementazione se non trovi un'implementazione di questo tipo, ma immagino che troverai alcune opzioni se esegui google le funzioni più esoteriche nel runtime objc; forse dovresti trovarne uno in un bind o bridge in una lingua (aperta)?

se si finisce per scriverne uno da soli, è possibile ottenere classi objc registrate utilizzando objc_getClassList, quindi accedere alle proprietà/informazioni che si desidera da lì.

+0

Justin, grazie per il feedback! Non sono a conoscenza di alcun metodo runtime oggettivo che mi consenta di vedere quali classi vengono utilizzate all'interno di un metodo. So di poter elencare i metodi disponibili in una classe e ottenere una delle prime classi, ma come faccio a sapere che la classe Foo è stata utilizzata all'interno di un metodo? – Steve

+0

@Steve giusto. sarete in grado di ottenere layout di oggetti dettagliati, estrarre interfacce pubbliche e private, elenchi di protocolli, ecc. (sebbene gli argomenti dell'oggetto objc decadano in id nell'abi), ma questo approccio non vi dirà cosa succede nell'implementazione. Strumenti, grpof e gcov possono aiutarti in questo. poiché objc è un linguaggio molto dinamico, è ideale per valutare l'esecuzione di tali tipi. se hai bisogno di quel livello di dettaglio, la discarica di classe può essere un buon punto di partenza. inizialmente non avevo l'impressione che volessi tanti dettagli. – justin

Problemi correlati