Próbuję wygenerować wykres wywoływania, za pomocą którego znajdę wszystkie możliwe ścieżki wykonania, które trafiają w określoną funkcję (aby nie musieć ręcznie wymyślać wszystkich ścieżek, ponieważ istnieje wiele ścieżek prowadzących do tej funkcji ). Na przykład:
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: ...
Wypróbowałem Codeviz i Doxygen, w jakiś sposób oba wyniki pokazują tylko wywołania funkcji docelowej, D. W moim przypadku D jest funkcją składową klasy, której obiekt zostanie umieszczony w inteligentnym wskaźniku. Klienci zawsze uzyskają obiekt inteligentnego wskaźnika za pośrednictwem fabryki, aby wywołać D.
Czy ktoś wie, jak to osiągnąć?
źródło
Pass::print not implemented for pass: 'Print call graph to 'dot' file'!
co chodzi? brzęk 3.8-analyze
z jakiegoś powodu muszę usunąć tę opcję. Kolejne pytanie: czy mogę ustawić nazwę pliku wyjściowego na inną niż./callgraph.dot
?Możesz to osiągnąć używając doxygen (z opcją wykorzystania kropki do generowania wykresów).
Z Johannesem Schaubem - litb main.cpp, generuje to:
Doxygen / dot są prawdopodobnie łatwiejsze niż clang / opt do zainstalowania i uruchomienia. Sam nie udało mi się go zainstalować i dlatego starałem się znaleźć alternatywne rozwiązanie!
źródło
Statyczne obliczanie dokładnego wykresu wywołań C ++ jest trudne, ponieważ potrzebujesz precyzyjnego parsera języka, poprawnego wyszukiwania nazw i dobrego analizatora punktów do zrozumienia, który poprawnie honoruje semantykę języka. Doxygen nie ma żadnego z nich, nie wiem, dlaczego ludzie twierdzą, że lubią go w C ++; łatwo jest zbudować 10 liniowy przykład C ++, który Doxygen błędnie analizuje).
Może lepiej będzie, jeśli uruchomisz profiler czasowy, który dynamicznie zbiera wykres wywołań (to opisuje nasz) i po prostu przećwiczyć wiele przypadków. Takie programy profilujące pokażą Ci rzeczywisty wykres wykonywanych połączeń.
EDYCJA: Nagle przypomniałem sobie, że rozumiem C ++ , które twierdzi, że konstruuje wykresy wywołań. Nie wiem, czego używają do analizatora składni, ani czy dobrze wykonują szczegółową analizę; Nie mam konkretnego doświadczenia z ich produktem.
Jestem pod wrażeniem odpowiedzi Schauba za pomocą Clang; Spodziewałbym się, że Clang ma wszystkie elementy w porządku.
źródło
Możesz użyć CppDepend , może generować wiele rodzajów wykresów
źródło
Aby
clang++
polecenie wyszukało standardowe pliki nagłówkowe, np.mpi.h
Dwie dodatkowe opcje-### -fsyntax-only
, czyli pełne polecenie powinno wyglądać następująco:źródło
„Analizator C ++ Bsc” może wyświetlać wykresy wywołań - czytając plik wygenerowany przez narzędzie bscmake.
źródło
Doxygen + graphviz może rozwiązać większość problemów, gdy chcemy wygenerować wykres połączeń, przekazany następnie pracownikom.
źródło
Scitools Understand to fantastyczne narzędzie, lepsze niż wszystko, co wiem o inżynierii odwrotnej , i generuje wysokiej jakości wykresy .
Ale pamiętaj, że jest dość drogi i że wersja próbna ma wykres wywołania motyla ograniczony tylko do jednego poziomu połączenia (IMHO uważam, że nie pomagają sobie w tym…)
źródło