Maison  >  Article  >  développement back-end  >  Comment puis-je générer des graphiques d’appels pour le code C afin de tracer les chemins d’exécution ?

Comment puis-je générer des graphiques d’appels pour le code C afin de tracer les chemins d’exécution ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-14 21:30:02194parcourir

How Can I Generate Call Graphs for C   Code to Trace Execution Paths?

Générer des graphiques d'appel pour le code C afin de tracer les chemins d'exécution

En programmation C, identifier tous les chemins d'exécution possibles menant à une fonction particulière peut être une tâche manuelle fastidieuse, en particulier lorsqu'il s'agit de bases de code complexes. C'est là qu'interviennent les graphiques d'appels, fournissant une représentation graphique des relations d'appel de fonction.

Limitations de CodeViz et Doxygen

Bien que des outils comme CodeViz et Doxygen puissent générer des graphiques d'appels, ils se concentrent souvent sur l’affichage uniquement des appelés de la fonction cible. Cela peut s'avérer insuffisant dans les situations où vous devez retracer l'intégralité de la hiérarchie d'appel.

Une méthode efficace utilisant LLVM et Graphviz

Une approche robuste consiste à exploiter le compilateur LLVM infrastructure et Graphviz pour la génération de graphiques d'appel :

  1. Compilez le code en bitcode LLVM à l'aide de clang -S -emit-llvm.
  2. Analysez le bitcode pour identifier les relations d'appel à l'aide de opt -analyze.
  3. Générez une représentation DOT du graphique d'appel à l'aide de -dot-callgraph.
  4. Visualisez le graphique en utilisant dot -Tpng.

Voici un exemple :

$ clang++ -S -emit-llvm main1.cpp -o - | opt -analyze -dot-callgraph
$ dot -Tpng -ocallgraph.png callgraph.dot

Cela créera une image PNG de graphique d'appel (callgraph.png) décrivant les chemins d'exécution menant à la fonction cible.

Gestion des liens externes

Les liens externes peuvent introduire des complexités, car main est supposé être appelé en externe. Pour résoudre ce problème :

  1. Utilisez -std-link-opts dans l'analyseur pour prendre en compte les fonctions externes.
  2. Utilisez c filt pour démanteler les noms de fonctions et les noms de classes.
  3. Filtrez le nœud externe de la représentation DOT.

En incorporant ces étapes, vous pouvez générer des graphiques d'appels complets qui tracez efficacement les chemins d'exécution dans le code C, simplifiant ainsi la compréhension et le débogage du code.

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