J'essaie de générer un graphe d'appel avec lequel découvrir tous les chemins d'exécution possibles qui frappent une fonction particulière (pour ne pas avoir à comprendre tous les chemins manuellement, car il existe de nombreux chemins qui mènent à cette fonction ). Par exemple:
path 1: A -> B -> C -> D
path 2: A -> B -> X -> Y -> D
path 3: A -> G -> M -> N -> O -> P -> S -> D
...
path n: ...
J'ai essayé Codeviz et Doxygen, d'une manière ou d'une autre, les deux résultats ne montrent rien d'autre que des noms de fonction cible, D. Dans mon cas, D est une fonction membre d'une classe dont l'objet sera enveloppé dans un pointeur intelligent. Les clients obtiendront toujours l'objet pointeur intelligent via une fabrique afin d'appeler D.
Est-ce que quelqu'un sait comment y parvenir?
la source
Pass::print not implemented for pass: 'Print call graph to 'dot' file'!
Qu'est-ce qui se passe avec ça? clang 3.8-analyze
option pour une raison quelconque. Un autre Q: puis-je définir le nom du fichier de sortie sur autre chose que./callgraph.dot
?Vous pouvez y parvenir en utilisant doxygen (avec l'option d'utiliser le point pour la génération de graphiques).
Avec Johannes Schaub - litb main.cpp, il génère ceci:
doxygen / dot sont probablement plus faciles que clang / opt à installer et à exécuter. Je n'ai pas réussi à l'installer moi-même et c'est pourquoi j'ai essayé de trouver une solution alternative!
la source
Le calcul statique d'un graphe d'appel C ++ précis est difficile, car vous avez besoin d'un analyseur de langage précis, d'une recherche de nom correcte et d'un bon analyseur de points à respecter qui honore correctement la sémantique du langage. Doxygen n'en a aucun, je ne sais pas pourquoi les gens prétendent l'aimer pour C ++; il est facile de construire un exemple C ++ de 10 lignes que Doxygen analyse par erreur).
Vous feriez peut-être mieux d'exécuter un profileur de synchronisation qui collecte un graphe d'appel de manière dynamique (cela décrit le nôtre) et d'exercer simplement de nombreux cas. Ces profileurs vous montreront le graphique d'appel réel exercé.
EDIT: Je me suis soudainement souvenu de Comprendre pour C ++ , qui prétend construire des graphes d'appels. Je ne sais pas ce qu'ils utilisent pour un analyseur, ou s'ils font correctement l'analyse détaillée; Je n'ai aucune expérience spécifique avec leur produit.
Je suis impressionné par la réponse de Schaub, utilisant Clang; Je m'attendrais à ce que Clang ait tous les éléments correctement.
la source
Vous pouvez utiliser CppDepend , il peut générer de nombreux types de graphiques
la source
Pour que la
clang++
commande trouve des fichiers d'en-tête standard commempi.h
deux options supplémentaires doivent être utilisées-### -fsyntax-only
, c'est-à-dire que la commande complète doit ressembler à:la source
"C ++ Bsc Analyzer" peut afficher des graphiques d'appels - en lisant le fichier généré par l'utilitaire bscmake.
la source
doxygen + graphviz pourrait résoudre la plupart des problèmes lorsque nous voulons générer un graphe d'appel, ensuite confié à la main-d'œuvre.
la source
Scitools Understanding est un outil fantastique , meilleur que tout ce que je connais pour la rétro-ingénierie , et génère des graphiques de haute qualité .
Mais notez que c'est assez cher et que la version d'essai a son graphique d'appel papillon limité à un seul niveau d'appel (à mon humble avis, je crois qu'ils ne s'aident pas à le faire ...)
la source