Journal générateur de graphes d'appels

Posté par .
Tags : aucun
-1
8
mai
2004
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 (page perso) . Évalué à 4.

    Ben doxygen (avec graphwiz) est mon/ton/son ami.
    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 . Évalué à 2.

      Hum le problème de doxygen (ou alors je connais pas la fonctionalité) c'est qu'il te fait un graph des fonctions du fichier. J'aimerais choisir facilement les fonctions qu'il graphe pour expliquer des sous systèmes et les imbrications entre eux. doxygen + graphviz c'est bien pour la doc automatique mais pas assez souple quand tu veux documenter quelque chose de precis.

      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 . Évalué à 1.

    Il y a fenris de Michal Zalewski, qui me semble pouvoir faire ça :
    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.
  • # Again

    Posté par . Évalué à 2.

    Bon pour finir j'ai trouvé l'outil ultime je pense :-)

    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 . Évalué à 2.

      Salut !

      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 . Évalué à 1.

        1/ oui

        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 . Évalué à 1.

          2/ Ah ! Au temps pour moi, merci pour l'astuce !

          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 . Évalué à 1.

            bin en fait je m'en fou car si tu regardes je refais un appel a dot apres dotty.

            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 à ceux qui les ont postés. Nous n'en sommes pas responsables.