6
votes

Utiliser des métadonnées Objective-C pour générer un graphique de dépendance de classe

Ce gars est venu avec un joli outil soigné pour générer un graphique de dépendance de classe - cependant, il s'appuie sur l'analyse de votre code source et recherchez des directives #Import .

  • http://seriot.ch/blog.php?article=20110124 << / li>
  • https://github.com/nst/objc_dep/blob/ maître / objc-dep.py

    C'est soigné, mais j'ai un certain nombre de problèmes avec cela. Cela ne tient pas moins compte que cela ne tient pas compte des importations des importations ni des en-têtes de préfixes ni de la classe (ES) du fichier référencé par l'importation sont réellement utilisés.

    J'aimerais faire quelque chose de plus proche de Classe-Dump et examiner les métadonnées de l'objectif-C stockées dans le fichier MAC-O pour générer une représentation en mémoire des dépendances de la classe.

    Je préférerais ne pas faire cela à partir de zéro, alors je me demande:

    • a-t-il déjà été fait?
    • y a-t-il une bibliothèque open source qui me fournirait les outils fondamentaux que j'ai besoin d'extraire ces informations (une bibliothèque qui examine le fichier Mach-O et crée une façade des informations de l'objectif-C contenues dans - telle que je pourrait iTER sur toutes les classes, leurs méthodes, leurs propriétés, leurs propriétés, des ivars, etc. et de numériser des références à d'autres classes) I Figure Source de Classe-Dump serait un bon endroit pour commencer.
    • Si vous avez de l'expérience dans ce genre de chose, c'est ce que j'essaie d'accomplir réalisable?
    • Quels barrages routiers devrai-je surmonter?

0 commentaires

3 Réponses :


1
votes

a-t-il déjà été fait?

Oui - mais je ne peux pas recommander une bonne implémentation publique

Y a-t-il une bibliothèque open source qui me fournirait les outils fondamentaux dont j'ai besoin pour extraire ces informations (une bibliothèque qui examine le fichier MACH-O et crée une façade des informations de l'objectif-C contenues dans - telle que je pourrait parcourir toutes les classes, leurs méthodes, leurs propriétés, leurs propriétés, des ivars, etc. et une analyse des références à d'autres classes) I Figure CLASS-Dump's Source serait un bon endroit pour commencer.

La plupart des cas d'utilisation bénéficieraient en utilisant l'OBJC Runtime Installations Objc /...< / Code> Plutôt que d'examiner le binaire.

Si vous avez de l'expérience dans ce genre de chose, c'est ce que j'essaie d'accomplir réalisable?

oui. J'ai fait quelque chose de similaire à l'aide du runtime Objc.

Quels barrages routiers devrai-je surmonter?

Cela dépend en grande partie du niveau de détail que vous souhaitez ... Temps de mise en œuvre Si vous ne trouvez pas de ce type de mise en œuvre, mais je pense que vous trouverez quelques options si vous Google les fonctions plus ésotériques dans l'OBJC Runtime; Peut-être que vous en trouveriez un dans une liaison ou un pont (ouvert) de langue?

Si vous finissez par écrire un vous-même, vous pouvez obtenir des classes OBJC enregistrées à l'aide de objc_getclasslist , puis accédez aux propriétés / informations que vous souhaitez à partir de là.


2 commentaires

Justin, merci pour les commentaires! Je ne suis au courant d'aucune méthode d'exécution de l'objectif C qui me laissera voir quelles classes sont utilisées à l'intérieur d'une méthode. Je sais que je peux énumérer les méthodes disponibles sur une classe et obtenir une CLST de cours, mais comment saurais-je savoir que la classe FOO a été utilisée dans une méthode?


@Steve Droite. Vous serez en mesure d'obtenir des dispositions détaillées d'objet, d'extraire des interfaces publiques et privées, des listes de protocoles, etc. (bien que les arguments d'objet Objc soient décomposés à l'ID dans l'ABI), mais cette approche ne vous dira pas ce qui se passe dans la mise en œuvre. Les instruments, GRPOF et GCOV peuvent vous aider avec cela. Depuis que l'Objc est une langue très dynamique, il est idéal pour évaluer l'exécution de tels types. Si vous avez besoin de ce niveau de détail - le décharge de classe peut être un bon point de départ. Je n'ai pas été à l'origine sous l'impression que vous vouliez avoir beaucoup de détails.



3
votes

a-t-il déjà été fait?

pas que je connaisse.

Y a-t-il une bibliothèque open source qui me fournirait le Outils fondamentaux J'ai besoin d'extraire cette information?

au cœur de CLASS-Dump est libmachobjc qui fait exactement ce que vous voulez, c'est-à-dire analyser toutes les classes / méthodes / ivars et plus encore. L'API est très propre, il devrait être très facile à utiliser.

Si vous avez de l'expérience dans ce genre de chose, c'est ce que j'essaie de accomplir réalisable?

Malheureusement, non, car certaines classes ne déclarent pas la classe réelle mais utilisent ID . Par exemple, voici les informations pouvant être extraites à partir d'une vidage de classe d'Uikit: xxx

_rowdata Les informations de type ivar sont ID Mais si vous vérifiez au moment de l'exécution, vous verrez que _rowdata est une instance de la classe utableviewowdata . Ces informations ne sont pas présentes dans le Binary Mach-O, vous n'avez donc aucun moyen de trouver la relation entre utableview et utableviewrowdata . La même chose s'applique aux paramètres de la méthode.


1 commentaires

Merci pour la réponse! Je comprends le problème id . Cependant, une des deux possibilités existe: a.) La classe actuelle utilisée pour _rowdata n'est pas une dépendance de votre classe d'échantillons. ou b.) La classe actuelle utilisée pour _rowdata est référencée par l'une de vos méthodes de votre classe d'échantillons - dans quel cas, numérisation du contenu de toutes les méthodes me permettraient de trouver cette dépendance.



2
votes

Voici une solution qui repose sur des informations dans les fichiers Mach.o et génère une dépendance graphique basée sur ces informations: https://github.com/pultaykalo/objc-dependency-visualizer Entrez la description de l'image ici


0 commentaires