Maison > développement back-end > C++ > Comment puis-je générer un graphique d'appel pour le code C afin de visualiser les chemins d'exécution ?

Comment puis-je générer un graphique d'appel pour le code C afin de visualiser les chemins d'exécution ?

Patricia Arquette
Libérer: 2024-12-01 01:41:12
original
310 Les gens l'ont consulté

How can I generate a call graph for C   code to visualize execution paths?

Génération d'un graphe d'appel pour le code C afin de visualiser les chemins d'exécution

Pour générer un graphe d'appel pour le code C, nous visons à découvrir tout le potentiel chemins d’exécution qui mènent à une fonction cible spécifique. Cela peut être bénéfique pour éliminer l'identification manuelle de chaque chemin, en particulier lorsqu'il existe plusieurs chemins.

Dans l'exemple fourni, la fonction cible est D. Pour y parvenir, nous pouvons utiliser les étapes suivantes :

static void D() {}
static void Y() { D(); }
static void X() { Y(); }
static void C() { D(); X(); }
static void B() { C(); }
static void S() { D(); }
static void P() { S(); }
static void O() { P(); }
static void N() { O(); }
static void M() { N(); }
static void G() { M(); }
static void A() { B(); G(); }

int main() {
  A();
}
Copier après la connexion

Une fois que nous avons notre code, nous pouvons générer le graphique d'appel à l'aide des commandes suivantes :

$ clang++ -S -emit-llvm main1.cpp -o - | opt -analyze -dot-callgraph
$ dot -Tpng -ocallgraph.png callgraph.dot
Copier après la connexion

Cela produira une représentation visuelle de l'appel graphique.

Cependant, pour obtenir les noms de fonctions réels plutôt que leurs homologues mutilés, nous pouvons post-traiter le graphique à l'aide de c filt :

#include <vector>

struct A { 
  A(int);
  void f(); // not defined, prevents inlining it!
};

int main() {
  std::vector<A> v;
  v.push_back(42);
  v[0].f();
}

$ clang++ -S -emit-llvm main1.cpp -o - |
 opt -analyze -std-link-opts -dot-callgraph
$ cat callgraph.dot | 
 c++filt | 
 sed 's,>,\>,g; s,-\>,->,g; s,<,\<,g' | 
 gawk '/external node/{id=}  != id' | 
 dot -Tpng -ocallgraph.png    
Copier après la connexion

Cela donnera un graphique d'appel plus informatif, montrant les noms réels des fonctions et des classes impliquées.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal