Lorsque l'on travaille sur une application de plus de 10-15 fonctions, il devient difficile de bien cerner les appels entre ces fonctions. Ceci est d'autant plus vrai dans le cadre de projets libres dont les codes sont souvent l'œuvre d'une (ou plusieurs) autre(s) personne(s). Parfois, ces codes sont bien documentés (commentaires, document de conception, etc.). Mais souvent, ce n'est pas le cas et les codes restent obscurs pour un nouveau développeur. Pour intervenir dans ces codes, un des éléments indispensable à leur compréhension est l'arbre d'appel.
Un arbre d'appel est une représentation arborescente des appels de fonctions entre elles. On distingue deux arbres d'appels :
L'arbre d'appel statique : il représente l'ensemble de toutes les possibilités d'appel définies par les codes sources (y compris celles qui ne sont pas accessibles car les conditons pour les provoquer ne sont jamais remplies).
L'arbre d'appel dynamique : il représente l'ensemble des appels provoqués par une exécution du programme.
Les plateformes de type UNIX© proposent des utilitaires pour obtenir ces arbres d'appel (par exemple cflow et gprof). Or le résultat de ceux-ci (une sortie de type texte), bien que parfaitement exploitable, est assez désagréable à manipuler. Ce résultat est d'autant plus désagréable à manipuler que par nature ces informations se prètent plus à une représentation graphique que textuelle.
La représentation graphique d'un arbre est loin d'être un problème simple à résoudre. Heureusement, il existe un outil qui fait ça très bien : xvcg développé par I. Lemke, G. Sander<sander@cs.uni-sb.de> et the Compare Consortium et est maintenue par Shantanu Tarafdar<shantanu@ece.neu.edu>.
Restant dans la philosophie Unix, cflow2vcg vient donc faire, aussi simplement que possible, le lien entre cflow et xvcg. Nous ne nous interresserons qu'aux arbres d'appels statiques car les arbres d'appels dynamiques peuvent être produits avec Call Graph Drawing Interface développé par Vadim Engelson <vaden@ida.liu.se>.
Note : Bien que cflow2vcg n'en soit qu'a sa toute première version, il n'en reste pas moins parfaitement utilisable. Je l'utilise d'ailleurs de façon opérationnelle très régulièrement.
cflow2vcg est développé et distribué sous Licence Publique Générale GNU (GNU General Public License - GPL). Ceci vous permet, en particulier, d'adapter cflow2vcg à vos besoins si nécessaire. Si tel est le cas, je vous invite à prendre contact avec moi <guyou@sourceforge.net> car vos modifications peuvent interresser les autres utilisateurs.
cflow2vcg fonctionne actuellement sur plateforme Sun Solaris™. Toutefois vu la simplicité des moyens externes utilisés, sa génération sur d'autre plateforme ne présente aucun problème. La difficulté majeure reste le format résultat de la commande cflow qui n'est pas obligatoirement le même sur toutes les plateformes. Ce point n'a pas été testé.
Des outils de type cflow existent sur plateforme GNU/Linux mais ne semblent pas installés par les distributions. Une petite recherche sur un moteur de recherche quelconque devrait vous permettre d'en trouver un rapidement. Personnellement, le cflow que j'ai installé ne produit pas la même sortie que le cflow de Sun Solaris™. Des moyens d'analyse de ces formats de sortie sont en cours de développement.
Une impémentation de cflow fournie par Andrew Moore est disponible à l'adresse ftp://ftp.ntua.gr/pub/linux/debian/pool/main/c/cflow/cflow_2.0.orig.tar.gz.
Les dernières versions de cflow2vcg savent utiliser ce format.
cflow2vcg est hébergé par SourceForge. Il dispose donc de tous les moyens de diffusion et de communication sur son site. Les sources sont accessibles y sont accessibles ainsi que des versions binaires.
Comme nombre de projets libres, cflow2vcg utilise les facilité de génération offertes par configure. Pour générer l'application, il suffit de faire comme d'habitude :
% gunzip -c cflow2vcg-x-x.tar.gz | tar xf - % cd cflow2vcg-x-x % ./configure % make
Comme toujours, il est possible de paramétrer la génération grâce à configure. Pour connaître les possibilités de paramétrage, exécutez ./configure --help.
L'installation de cflow2vcg dans /usr/local se fait simplement avec :
% make install
Gràce à configure il est possible de paramétrer très finement l'installation. Pour en savoir plus, exétez ./configure --help.
cflow2vcg [-e | -i] [-h] [-v]
cflow2vcg lit un fichier de type cflow sur son entrée standard et produit un équivalent au format vcg sur sa sortie standard. Ce "flot" produit peut être manipulé par les applications capables de manipuler le format VCG et en particulier xvcg.
Le fichier VCG produit par cflow2vcg permet de réduire le graphe aux appels vers des fonctions internes (définies dans les fichiers annalysés par cflow) ou au appels vers des fonctions externes (par exemple les fonctions systè). Cette fonctionnalité est extrèmement utile pour comprendre le lien entre les différents modules contenus dans votre application.
Pour restreindre l'arbre à l'un de ces types d'appel, il suffit de le sélectionner dans le dialogue Expose/Hide Edges... de xvcg.
La production d'un fichier graphique à partir de xvcg ne permet pas (à moins qu'il y ait une option que je n'ai pas trouvée) de réaliser cette restriction. Pour y parvenir, cflow2vcg dispose des options [-i] et [-e] pour restreindre le graphe dè sa production.
Les exemples sont basés sur le code de cflow2vcg. Les fichiers intermédiaires ayant servi à produire les exemples sont disponibles dans le répertoire doc de la distribution :
cflow2vcg.cflow pour le résultat de cflow,
cflow2vcg.vcg pour le résultat de cflow2vcg sur le fichier précédent.
Pour visualiser un graphe :
% cflow cflow2vcg.c | cflow2vcg | xvcg -
Le résultat est :
En ne sélectionnant que les nœuds internes (soit depuis xvcg, soit depuis cflow2vcg), on obtient :
En ne sélectionnant que les nœuds externes (soit depuis xvcg soit depuis cflow2vcg), on obtient :
Pour imprimer un graphe :
% cflow cflow2vcg.c | cflow2vcg | xvcg - -psoutput file.ps % lp file.ps
xvcg offre de nombreux paramètres pour maîtriser le rendu de l'impression. Consultez son aide en ligne (man vcg) pour en savoir plus.
Le principe utilisé (aujourd'hui) par cflow2vcg est extrèmement simple. Il consiste à convertir ligne à ligne la sortie de cflow en instructions VCG.
Cela consiste à reconnaître si la ligne lue correspond à :
une ligne de déclaration/définition d'un symbole, auquel cas on doit produire un noeud,
une ligne de simple référence, auquel on ne produit rien.
N'hésitez pas à me faire parvenir vos questions, remarques, bugs et autre par mail à <guyou@sourceforge.net>.
Les grosses évolutions prévues sont :
enrichissement du fichier VCG produit avec le maximum des informations produites par cflow (Cf. Section 5.2.1),
packages (RPM),
internationnalisation du fichier VCG produit et de la documentation.
Aujourd'hui, cflow2vcg n'exploite pas l'information de nom de fichier de définition. On peut prévoir de placer cette information dans un champ info d'un nœud. On peut aussi envisager d'utiliser cette information pour permettre de restreindre le graphe. Ceci pourrait passer par la création d'un graph par fichier. Pour y parvenir, cela nécessite de complexifier le programme puisqu'il faudra mémoriser les informations dans une structure avant de les écrire dans le fichier de sortie.