J'ai un grand espace de travail qui contient de nombreux fichiers source de code C. Bien que je puisse voir les fonctions appelées à partir d'une fonction dans MS VS2005 à l'aide du navigateur d'objets, et également dans MSVC 6.0, cela ne montre que les fonctions appelées à partir d'une fonction particulière dans un type d'affichage non graphique. De plus, il n'affiche pas la fonction appelée à partir de say main()
, puis les fonctions appelées à partir de celle-ci, et ainsi de suite, plus profondément à l'intérieur de la fonction de niveau feuille.
J'ai besoin d'un outil qui me donnera un graphe d'appel de fonction en image avec des fonctions callee
et caller
connecté par des flèches ou quelque chose comme ça, en commençant par main()
le dernier niveau de fonction, ou au moins en montrant un graphe d'appel de toutes les fonctions dans un fichier source C en image. Ce serait formidable si je pouvais imprimer ce graphique.
Y a-t-il de bons outils pour faire cela (ne doivent pas être des outils gratuits)?
la source
Réponses:
Egypte (logiciel libre)
ncc
KcacheGrind (GPL)
Graphviz (CPL)
CodeViz (GPL)
la source
Méthodes d'analyse dynamique
Je décris ici quelques méthodes d'analyse dynamique.
Les méthodes dynamiques exécutent en fait le programme pour déterminer le graphe d'appel.
Le contraire des méthodes dynamiques sont les méthodes statiques, qui tentent de le déterminer à partir de la source seule sans exécuter le programme.
Avantages des méthodes dynamiques:
Inconvénients des méthodes dynamiques:
KcacheGrind
https://kcachegrind.github.io/html/Home.html
Programme de test:
Usage:
Vous êtes maintenant laissé dans un programme GUI génial qui contient beaucoup de données de performances intéressantes.
En bas à droite, sélectionnez l'onglet "Graphique d'appel". Cela affiche un graphique d'appel interactif qui correspond aux mesures de performances dans d'autres fenêtres lorsque vous cliquez sur les fonctions.
Pour exporter le graphique, cliquez dessus avec le bouton droit de la souris et sélectionnez "Exporter le graphique". Le PNG exporté ressemble à ceci:
À partir de là, nous pouvons voir que:
_start
, qui est le point d'entrée ELF réel, et contient le passe-partout d'initialisation de la glibcf0
,f1
etf2
sont appelés comme attendu l'un de l'autrepointed
est également affiché, même si nous l'avons appelé avec un pointeur de fonction. Il n'aurait peut-être pas été appelé si nous avions passé un argument de ligne de commande.not_called
n'est pas affiché car il n'a pas été appelé lors de l'exécution, car nous n'avons pas passé d'argument de ligne de commande supplémentaire.Ce qui est cool,
valgrind
c'est qu'il ne nécessite aucune option de compilation spéciale.Par conséquent, vous pouvez l'utiliser même si vous n'avez pas le code source, seulement l'exécutable.
valgrind
parvient à le faire en exécutant votre code via une "machine virtuelle" légère. Cela rend également l'exécution extrêmement lente par rapport à l'exécution native.Comme on peut le voir sur le graphique, des informations de synchronisation sur chaque appel de fonction sont également obtenues, et cela peut être utilisé pour profiler le programme, ce qui est probablement le cas d'utilisation d'origine de cette configuration, pas seulement pour voir les graphiques d'appel: Comment puis-je profiler Code C ++ fonctionnant sous Linux?
Testé sur Ubuntu 18.04.
gcc -finstrument-functions
+ etracehttps://github.com/elcritch/etrace
-finstrument-functions
ajoute des callbacks , etrace analyse le fichier ELF et implémente tous les callbacks.Malheureusement, je n'ai pas pu le faire fonctionner: pourquoi `-finstrument-functions` ne fonctionne-t-il pas pour moi?
La sortie revendiquée est de format:
Probablement la méthode la plus efficace en plus de la prise en charge du traçage matériel spécifique, mais présente l'inconvénient de devoir recompiler le code.
la source
Comprendre fait un très bon travail de création de graphiques d'appels.
la source
Notre boîte à outils de réingénierie logicielle DMS a une analyse statique de contrôle / flux de données / points à / appel qui a été appliquée à d'énormes systèmes (~~ 25 millions de lignes) de code C, et a produit de tels graphiques d'appel, y compris des fonctions appelées via des pointeurs de fonction .
la source
Vous pouvez essayer CScope + tceetree + Graphviz .
la source
Vous pouvez consulter mon générateur d'arbre d'appels C basé sur bash ici . Il vous permet de spécifier une ou plusieurs fonctions C pour lesquelles vous voulez des informations sur l'appelant et / ou appelé, ou vous pouvez spécifier un ensemble de fonctions et déterminer le graphe d'accessibilité des appels de fonction qui les connecte ... Ie me dire toutes les manières principales ( ), foo () et bar () sont connectés. Il utilise graphviz / dot pour un moteur graphique.
la source
Astrée est l'outil le plus robuste et sophistiqué là-bas, à mon humble avis.
la source