Ich habe einen großen Arbeitsbereich mit vielen Quelldateien von C-Code. Obwohl ich die von einer Funktion in MS VS2005 mit dem Objektbrowser und auch in MSVC 6.0 aufgerufenen Funktionen sehen kann, werden hier nur Funktionen angezeigt, die von einer bestimmten Funktion in einer nicht grafischen Anzeige aufgerufen wurden. Außerdem wird die aufgerufene Funktion nicht angezeigt, beginnend mit say main()
, und dann die von ihr aufgerufenen Funktionen usw., die sich tiefer in der Funktion auf Blattebene befinden.
Ich brauche ein Werkzeug , das mir einen Funktionsaufruf Graph bildhaft mit Funktionen geben wird callee
und caller
durch die Pfeile oder ähnliches verbunden, ausgehend main()
bis zur letzten Stufe der Funktion oder zumindest bildlich einen Aufrufgraphen aller Funktionen in einer C - Quelldatei zeigen. Es wäre toll, wenn ich diese Grafik drucken könnte.
Irgendwelche guten Werkzeuge, um das zu tun (müssen keine freien Werkzeuge sein)?
quelle
Antworten:
Ägypten (freie Software)
ncc
KcacheGrind (GPL)
Graphviz (CPL)
CodeViz (GPL)
quelle
Dynamische Analysemethoden
Hier beschreibe ich einige dynamische Analysemethoden.
Dynamische Methoden führen das Programm tatsächlich aus, um das Aufrufdiagramm zu bestimmen.
Das Gegenteil von dynamischen Methoden sind statische Methoden, die versuchen, sie allein aus der Quelle zu ermitteln, ohne das Programm auszuführen.
Vorteile dynamischer Methoden:
Nachteile dynamischer Methoden:
KcacheGrind
https://kcachegrind.github.io/html/Home.html
Testprogramm:
Verwendung:
Sie befinden sich jetzt in einem fantastischen GUI-Programm, das viele interessante Leistungsdaten enthält.
Wählen Sie unten rechts die Registerkarte "Anrufdiagramm". Dies zeigt ein interaktives Anrufdiagramm, das mit Leistungsmetriken in anderen Fenstern korreliert, wenn Sie auf die Funktionen klicken.
Um das Diagramm zu exportieren, klicken Sie mit der rechten Maustaste darauf und wählen Sie "Diagramm exportieren". Das exportierte PNG sieht folgendermaßen aus:
Daraus können wir das ersehen:
_start
ist der eigentliche ELF-Einstiegspunkt und enthält das Glibc-Initialisierungs-Boilerplatef0
,f1
Undf2
wie erwartet voneinander genanntpointed
wird auch gezeigt, obwohl wir es mit einem Funktionszeiger aufgerufen haben. Es wurde möglicherweise nicht aufgerufen, wenn wir ein Befehlszeilenargument übergeben hätten.not_called
wird nicht angezeigt, weil es im Lauf nicht aufgerufen wurde, weil wir kein zusätzliches Befehlszeilenargument übergeben haben.Das Coole daran
valgrind
ist, dass keine speziellen Kompilierungsoptionen erforderlich sind.Daher können Sie es auch dann verwenden, wenn Sie nicht über den Quellcode, sondern nur über die ausführbare Datei verfügen.
valgrind
Dies gelingt Ihnen, indem Sie Ihren Code über eine einfache "virtuelle Maschine" ausführen. Dies macht die Ausführung im Vergleich zur nativen Ausführung extrem langsam.Wie in der Grafik zu sehen ist, werden auch Zeitinformationen zu jedem Funktionsaufruf abgerufen. Diese können verwendet werden, um das Programm zu profilieren, was wahrscheinlich der ursprüngliche Anwendungsfall dieses Setups ist, und nicht nur, um Aufrufdiagramme anzuzeigen: Wie kann ich ein Profil erstellen? C ++ - Code unter Linux?
Getestet unter Ubuntu 18.04.
gcc -finstrument-functions
+ etracehttps://github.com/elcritch/etrace
-finstrument-functions
Fügt Rückrufe hinzu , etrace analysiert die ELF-Datei und implementiert alle Rückrufe.Ich konnte es jedoch leider nicht zum Laufen bringen : Warum funktionieren `-finstrument-Funktionen` bei mir nicht?
Die behauptete Ausgabe hat das Format:
Wahrscheinlich die effizienteste Methode neben der Unterstützung spezifischer Hardware-Ablaufverfolgung, hat jedoch den Nachteil, dass Sie den Code neu kompilieren müssen.
quelle
Understand leistet sehr gute Arbeit beim Erstellen von Anrufdiagrammen.
quelle
Unser DMS Software Reengineering Toolkit verfügt über eine statische Steuerung / Datenfluss- / Punkt-zu-Anruf-Diagrammanalyse , die auf große Systeme (~ ~ 25 Millionen Zeilen) von C-Code angewendet wurde, und hat solche Aufrufdiagramme erstellt, einschließlich Funktionen, die über Funktionszeiger aufgerufen werden .
quelle
Sie können CScope + tceetree + Graphviz ausprobieren .
quelle
Sie können meinen Bash-basierten C-Call-Tree-Generator hier ansehen . Hier können Sie eine oder mehrere C-Funktionen angeben, für die Sie Anrufer- und / oder angerufene Informationen benötigen, oder Sie können eine Reihe von Funktionen angeben und das Erreichbarkeitsdiagramm der Funktionsaufrufe bestimmen, die sie verbinden. ), foo () und bar () sind verbunden. Es verwendet graphviz / dot für eine Grafik-Engine.
quelle
Astrée ist meiner Meinung nach das robusteste und fortschrittlichste Werkzeug auf dem Markt.
quelle