Heim > Backend-Entwicklung > C++ > Wie erstelle ich mit LLVM ein Aufrufdiagramm für C-Code?

Wie erstelle ich mit LLVM ein Aufrufdiagramm für C-Code?

DDD
Freigeben: 2024-11-16 10:59:03
Original
928 Leute haben es durchsucht

How to Generate a Call Graph for C   Code Using LLVM?

Erstellen eines Aufrufdiagramms für C-Code

Um potenzielle Ausführungspfade für eine bestimmte Funktion aufzudecken, insbesondere wenn eine manuelle Identifizierung unpraktisch ist nützlich, um ein Anrufdiagramm zu erstellen.

Erstellen eines Anrufdiagramms mit LLVM:

Um ein Aufrufdiagramm mit LLVM (Low-Level Virtual Machine) zu erstellen, befolgen Sie diese Schritte:

  1. Kompilieren Sie den C-Code mit dem -emit Option -llvm zum Generieren einer LLVM-Assembly:

    clang++ -S -emit-llvm main.cpp -o -
    Nach dem Login kopieren
  2. Analysieren Sie die Assembly mit der Option Tool mit dem Flag -analyze:

    opt -analyze main.ll
    Nach dem Login kopieren
  3. Erzeugen Sie eine DOT-Datei, die das Anrufdiagramm darstellt:

    opt -analyze -dot-callgraph main.ll
    Nach dem Login kopieren
  4. Konvertieren Sie die DOT-Datei in ein Bildformat mit Graphviz:

    dot -Tpng -o callgraph.png callgraph.dot
    Nach dem Login kopieren

Dieser Prozess erzeugt eine visuelle Darstellung des Aufrufdiagramms, die alle Pfade zeigt, die zur Zielfunktion führen.

Beispiel:

Betrachten Sie den folgenden C-Code:

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();
}
Nach dem Login kopieren

Mit den oben beschriebenen Schritten können wir ein Aufrufdiagramm erstellen, das alle möglichen Pfade aufzeigt, über die D() erfolgen kann aufgerufen.

Zusätzliche Überlegungen:

  • Bei komplexen Codebasen mit zahlreichen Aufrufpfaden kann es erforderlich sein, die DOT-Datei mit Tools wie C-Filter nachzubearbeiten um für Menschen lesbare Funktionsnamen zu erhalten.
  • Standardmäßig geht opt ​​davon aus, dass eine externe Funktion vorhanden ist, die herausgefiltert oder umbenannt werden kann Klarheit.
  • Stellen Sie sicher, dass die Zielfunktion nicht inline ist, um die Anrufhierarchie genau zu erfassen.

Das obige ist der detaillierte Inhalt vonWie erstelle ich mit LLVM ein Aufrufdiagramm für C-Code?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage