Je suis à la recherche d'un générateur de graphe d'appel statique ( C ) ou dynamique. Après une journée de recherche je n'ai rien trouvé qui soit satisfaisant.
J'ai trouvé :
http://www.fokus.gmd.de/research/cc/glone/employees/joerg.schilling(...)
Calltree qui fait une analyse statique et qui produit un .dot. Ca marche pas mal mais je n'arrive pas a limiter le graphe sur une fonction donnée (option list= ). Donc c'est pas très très pratique...
http://www.csn.ul.ie/~mel/projects/codeviz/(...)
Codeviz fait par mel gorman pour sa doc sur la VM. Mais bon j'ai pas super envie de patcher gcc la même si ca ne me generait pas en temps normal
http://kcachegrind.sourceforge.net/cgi-bin/show.cgi/KcacheGrindDown(...)
un skin pour valgrind qui genère bien l'arbre d'appel (+ profiling) mais le stock dans un format alakon comprendre qu'il faut avoir kcachegrind (donc QT/KDE) pour générer un png. Ce qui est assez embettant et j'ai pas le temps de faire un convertisseur en .dot.
Donc est ce que j'aurais loupé le bijou ? Et vous vous utilisez quoi ? voila en esperant que ca profite à tout le monde :-)
Le but étant d'arriver a des graphes comme ca ( http://www.csn.ul.ie/~mel/projects/codeviz/alloc_pages.png(...) ) pour expliquer plus facilement la structure d'un projet par exemple.
# Doxygen
Posté par Émilien Kia (site web personnel) . Évalué à 4.
Surtout pour le C.
Tu peux même utiliser doxywizard (livré avec doxygen) où dans l'onglet "dot", il faut préciser que tu utilise graphwiz (utilitaires de dot) et que tu veux le graphe des appels.
Attention l'utilitaire dot est un poil lent sur les gros projets mais donne des résultats assez util(isable)s.
Un jour libre ?
[^] # Re: Doxygen
Posté par ckyl . Évalué à 2.
Mais je me trompe peut etre et retourne de ce pas relire la doc de doxygen :-)
[graphviz peut etre tres lent et tres gourmant pour la generation d'image (ie non ps). J'ai deja fait des graphes qui ont bouffés dans les 3Go de RAM :-) ]
# Fenris
Posté par dvrasp . Évalué à 1.
http://lcamtuf.coredump.cx/fenris/(...)
J'ai trouvé aussi ça :
http://www.ida.liu.se/~vaden/cgdi/(...)
http://kprof.sourceforge.net/(...)
Mais j'ai le souvenir d'un post de slashdot, bugtraq ou autre, qui présentait un autre soft qui m'a parru meilleur. Pas moyen de le retrouver.
[^] # Re: Fenris
Posté par ckyl . Évalué à 1.
Qui genere un beau .dot de tout le callgraph. Il manque d'option (y'en a pas) mais vu la facilité de manipulation d'un .dot je vais pas m'ennerver pour le moment :-)
Je perdrais du temps a le rendre plus sympatique un peu plus tard.
[^] # Re: Fenris
Posté par dvrasp . Évalué à 1.
flowgraph :
http://www.big.net.au/~silvio/coding/graphing/(...)
À voir aussi :
http://www.cartel-securite.fr/pbiondi/python/bin2graph.py(...)
# Again
Posté par ckyl . Évalué à 2.
compiler avec -g -pg
Executer le code a tracer
gprof ./exec | cgprof > out.dot && dotty out.dot && dot -Tpng out.out -o out.png
l'étape dotty permet de manipuler graphiquement le graph pour virer ce qui est inutile ou faire d'autre choses interessantes.
On peut passer --static-call-graph a gprof pour qu'il analyse le code et affiche dans le call graph les branches non exécutées. avec l'option -qfonction on peut choisir a partir d'ou tracer. Voila :-)
[^] # Re: Again
Posté par SaintGermain . Évalué à 2.
C'est rigolo, je cherchais exactement le même truc !
Quelques remarques :
1) Dans ta ligne pour l'utilisation de cgprof, il faut remplacer out.out par out.dot il me semble...
2) cgprof n'est pas très bien codé, lors de son utilisation avec une version francisée de gcc, ça ne marche pas. Dans le source il faut en effet remplacer /Call graph/ par /Appel de graphe/ (à la ligne 92)
3) Ne peut-on pas arriver au même résultat (qui est quand même vraiment bien !) avec simplement les différentes fonctions de graphviz ? je n'ai pas regardé en profondeur donc je peux me tromper...
4) Merci du tuyau ! Si tu trouves d'autres utilitaires pour faire ça, je veux bien les évaluer avec toi si tu veux bien me tenir au courant !
[^] # Re: Again
Posté par ckyl . Évalué à 1.
2/ Bin disons qu'il n'y a pas grand chose avoir gcc mais avec gprof. En effet si ta locale est en fr ca va pas marcher. En même temps quand on voit la traduction fr de gcc & co il reste pas grand monde à l'utiliser :-)
tu peux faire LC_ALL=C gprof ./binaire et ca marchera
3/ Bin graphviz son but c'est de tracer des graphes a partir d'un fichier d'entré. Ce fichier doit être dans un format donné (.dot). Donc il faut bien un convertisseur quelque part. Donc je pense pas
Au fait je l'ai pas dit mais y'a un bug dans dotty qui ne marche pas si numlock est verrouillé...
Exemple de sortie rapidement épurée : http://euterpe.unice.fr/~mathieuc/out.png(...)
[^] # Re: Again
Posté par SaintGermain . Évalué à 1.
3/ D'accord, en étant allé sur leur site, je voyais tout plein de screenshots somptueux de graphe d'appels, mais je ne savais pas que cela demandait un pré-traitement par un outils tiers.
Pas mal du tout ton exemple épuré, c'est après retouche avec dotty ?
Car dotty est pas mal mais je n'ai pas encore trouvé comment modifier les lignes entres les noeuds. Je déplace les noeuds et les lignes suivent bêtement la ligne droite entres les noeuds...
Il y a bien un petit rond sur les lignes qui semble être une sorte de poignée pouvant servir à déplacer les lignes, mais impossible de le sélectionner et de le bouger (et mon numlock n'est pas verrouillé !).
[^] # Re: Again
Posté par ckyl . Évalué à 1.
dotty me sert juste a supprimer les noeuds en trop puisque dans ce cas la je n'ai pas d'interet a faire un script qui les vire automatiquement. et je sauvegarde le graphe puis appel dot qui va recalculer le graphe et faire des jolis sommets entre les noeuds. Et j'avoue que les sommets tracé par dot me vont très bien pour le moment :-)
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.