Erste Control-Flow-Graph von ANSI-C-code
Ich Baue tool zum testen der ansi-c-Anwendungen. Laden Sie einfach das code-view-control-flow-graph, test ausführen, markieren Sie alle Knoten, die getroffen wurde. Ich bin versucht zu bauen CFG alle von mir aus dem parsing-code. Leider Durcheinander gebracht, wenn der code verschachtelt ist. GCC gibt die Möglichkeit zu bekommen, CFG von kompilierten code. Ich könnte schreiben parser für seine Ausgabe, aber ich brauche Zeilennummern für das setzen von breakpoints. Ist es Weg, für immer Zeilennummern bei der Ausgabe von Control Flow Graph mit -fdump-tree-cfg
oder -fdump-tree-vcg
?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Für den control-flow-graph eines C-Programms kann man sich an den bestehenden Python-Parser für C:
Call Graphen sind eng verknüpft mit dem Konstrukt kontrollflußgraphen.
Es gibt mehrere Ansätze zur Verfügung, erstellen call-Graphen (Funktion Abhängigkeiten) für C-code.
Dies könnte sich als Hilfe für fortgeschrittene mit control flow graph generation.
Möglichkeiten zum erstellen von dependency Graphen in C:
Mit cflow:
--cpp
option Vorverarbeitung der code.Mit cscope:
ncc (wie cflow)
Den folgenden tools leider verlangen Sie, dass der code kompilierbar sein, da es davon abhängt Ausgabe von gcc:
egypt
verwendetgcc
zu produzierenRTL
, so fällt für alle buggy-source-code, oder sogar, wenn Sie nur wollen, um den Fokus auf eine einzelne Datei aus einem größeren Projekt. Daher ist es nicht sehr nützlich, im Vergleich zu den robusterencflow
-basierten Werkzeugketten. Beachten Sie, dass ägypten hat standardmäßig eine gute Unterstützung für den Ausschluss der Bibliothek Anrufe aus dem Diagramm, um es sauberer.Auch, Datei-dependency-Graphen für C/C++ erstellt werden können, mit
crowfood
.Also habe ich einige weitere Forschung, und es ist nicht schwer zu bekommen Zeilennummern für Knoten. Fügen Sie einfach
lineno
option, um eine dieser Optionen, um es zu bekommen. So verwenden-fdump-tree-cfg-lineno
oder-fdump-tree-vcg-lineno
. Es hat einige Zeit gedauert, um zu überprüfen, ob diese zahlen sind zuverlässige. Im Fall von Graphen in VCG format label für jeden Knoten enthält zwei zahlen. Das sind Zeilennummern für den Anfang und das Ende von code Teil vertreten, die von diesem Knoten.Dynamische Analyse-Methoden
In dieser Antwort, die ich beschreiben, ein paar dynamische Analyse-Methoden.
Dynamische Methoden wirklich das Programm ausführen, um zu bestimmen, die call-graph.
Das Gegenteil von dem, dynamische Methoden statische Methoden, die versuchen zu bestimmen, es von der Quelle allein, ohne das Programm läuft.
Vorteile der dynamischen Methoden:
Nachteile der dynamischen Methoden:
KcacheGrind
https://kcachegrind.github.io/html/Home.html
Test-Programm:
Verwendung:
Sind Sie nun mit der linken Innenseite eine tolle GUI-Programm, das enthält eine Vielzahl von interessanten Leistungsdaten.
Rechts unten, wählen Sie die "Call graph" - tab. Dies zeigt eine interaktive call-graph bezieht sich auf performance-Metriken in anderen Fenstern, wie Sie auf die Funktionen.
Um die Grafik zu exportieren, klicken Sie rechts und wählen Sie "Export Graph". Die exportierte PNG sieht wie folgt aus:
Aus, dass wir sehen können, dass:
_start
, ist die tatsächliche ELF Einstiegspunkt, und enthält glibc Initialisierung boilerplatef0
,f1
undf2
sind aufgerufen, wie erwartet von einem anderenpointed
wird auch gezeigt, obwohl wir nannten es eine Funktion, mit pointer. Es könnte nicht aufgerufen, wenn passierten wir ein command line argument.not_called
ist nicht dargestellt, da es nicht aufgerufen werden, in der Flucht, weil wir nicht bestanden hat, eine zusätzliche command-line-argument.Die kühle Sache über
valgrind
ist, dass es erfordert keine speziellen Kompilations-Optionen.Daher, Sie können es verwenden, auch wenn Sie nicht den Quellcode zu haben, nur die ausführbare Datei.
valgrind
schafft dies, indem Sie mit dem code durch ein leichtes "virtuelle Maschine".Getestet auf Ubuntu 18.04.
gcc -finstrument-functions
+ etracehttps://github.com/elcritch/etrace
-finstrument-functions
fügt Rückrufe, etrace analysiert die ELF-Datei und implementiert alle Rückrufe.Konnte ich nicht, es funktioniert aber leider nicht: Warum nicht `-finstrument-Funktionen` für mich arbeiten?
Behauptete Ausgabe von format:
Wahrscheinlich die effizienteste Methode, neben speziellen hardware-tracing-Unterstützung, hat aber den Nachteil, dass Sie den code neu kompilieren.