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
Patricia Arquetteoriginal
2024-12-01 01:41:12374parcourir

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();
}

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

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    

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!

Déclaration:
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