Ich versuche, ein aufrufendes Diagramm zu generieren, mit dem alle möglichen Ausführungspfade ermittelt werden können, die auf eine bestimmte Funktion treffen (damit ich nicht alle Pfade manuell ermitteln muss, da es viele Pfade gibt, die zu dieser Funktion führen ). Zum Beispiel:
path 1: A -> B -> C -> D
path 2: A -> B -> X -> Y -> D
path 3: A -> G -> M -> N -> O -> P -> S -> D
...
path n: ...
Ich habe Codeviz und Doxygen ausprobiert. Irgendwie zeigen beide Ergebnisse nur Callees der Zielfunktion D. In meinem Fall ist D eine Mitgliedsfunktion einer Klasse, deren Objekt in einen intelligenten Zeiger eingeschlossen wird. Clients erhalten das Smart-Pointer-Objekt immer über eine Factory, um D aufzurufen.
Weiß jemand, wie man das erreicht?
quelle
Pass::print not implemented for pass: 'Print call graph to 'dot' file'!
Was ist damit los? Clang 3.8-analyze
Option aus irgendeinem Grund entfernen . Noch ein F: Kann ich den Ausgabedateinamen auf etwas anderes als setzen./callgraph.dot
?Sie können dies erreichen, indem Sie Sauerstoff verwenden (mit der Option, Punkt für die Diagrammgenerierung zu verwenden).
Mit Johannes Schaub - litb main.cpp wird Folgendes generiert:
doxygen / dot sind wahrscheinlich einfacher zu installieren und auszuführen als clang / opt. Ich habe es nicht geschafft, es selbst zu installieren, und deshalb habe ich versucht, eine alternative Lösung zu finden!
quelle
Die statische Berechnung eines genauen C ++ - Aufrufdiagramms ist schwierig, da Sie einen präzisen Sprachparser, eine korrekte Namenssuche und einen guten Punkteanalysator benötigen, der die Sprachsemantik richtig berücksichtigt. Doxygen hat keine davon, ich weiß nicht, warum die Leute behaupten, es für C ++ zu mögen; Es ist einfach, ein 10-Zeilen-C ++ - Beispiel zu erstellen, das Doxygen fälschlicherweise analysiert.
Möglicherweise ist es besser, einen Timing-Profiler auszuführen, der ein Anrufdiagramm dynamisch erfasst (dies beschreibt unser), und einfach viele Fälle auszuführen. Solche Profiler zeigen Ihnen das tatsächlich ausgeübte Anrufdiagramm.
EDIT: Ich erinnerte mich plötzlich an Understand for C ++ , das behauptet, Aufrufgraphen zu erstellen. Ich weiß nicht, was sie für einen Parser verwenden oder ob sie die detaillierte Analyse richtig machen. Ich habe keine besonderen Erfahrungen mit ihrem Produkt.
Ich bin beeindruckt von Schaubs Antwort mit Clang; Ich würde erwarten, dass Clang alle Elemente richtig hat.
quelle
Sie können CppDepend verwenden , es kann viele Arten von Diagrammen erzeugen
quelle
Damit der
clang++
Befehl Standard-Header-Dateien findetmpi.h
, sollten zwei zusätzliche Optionen verwendet werden-### -fsyntax-only
, dh der vollständige Befehl sollte wie folgt aussehen:quelle
Der "C ++ Bsc Analyzer" kann Anrufdiagramme anzeigen - durch Lesen der vom Dienstprogramm bscmake generierten Datei.
quelle
doxygen + graphviz könnte die meisten Probleme lösen, wenn wir ein Anrufdiagramm erstellen möchten , das als nächstes an die Arbeitskräfte übergeben wird.
quelle
Scitools Understand ist ein fantastisches Tool, besser als alles, was ich für das Reverse Engineering weiß , und generiert hochwertige Grafiken .
Beachten Sie jedoch, dass es ziemlich teuer ist und dass in der Testversion das Schmetterlings-Anrufdiagramm auf nur eine Anrufstufe beschränkt ist (IMHO glaube ich, dass sie sich dabei nicht selbst helfen…).
quelle