Erzeugen eines Aufrufdiagramms für C-Code zur Visualisierung von Ausführungspfaden
Um ein Aufrufdiagramm für C-Code zu generieren, wollen wir alle Potenziale aufdecken Ausführungspfade, die zu einer bestimmten Zielfunktion führen. Dies kann hilfreich sein, um die manuelle Identifizierung jedes Pfads zu vermeiden, insbesondere wenn mehrere Pfade vorhanden sind.
Im bereitgestellten Beispiel ist die Zielfunktion D. Um dies zu erreichen, können wir die folgenden Schritte verwenden:
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(); }
Sobald wir unseren Code haben, können wir das Anrufdiagramm mit den folgenden Befehlen generieren:
$ clang++ -S -emit-llvm main1.cpp -o - | opt -analyze -dot-callgraph $ dot -Tpng -ocallgraph.png callgraph.dot
Dadurch wird eine visuelle Darstellung des Anrufs erstellt Diagramm.
Um jedoch die tatsächlichen Funktionsnamen und nicht ihre verstümmelten Gegenstücke zu erhalten, können wir das Diagramm mit C-Filter nachbearbeiten:
#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
Dies führt zu einem informativeren Aufrufdiagramm die tatsächlichen Namen der beteiligten Funktionen und Klassen.
Das obige ist der detaillierte Inhalt vonWie kann ich ein Aufrufdiagramm für C-Code erstellen, um Ausführungspfade zu visualisieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!