Mam dużą przestrzeń roboczą, która zawiera wiele plików źródłowych kodu C. Chociaż widzę funkcje wywoływane z funkcji w MS VS2005 przy użyciu przeglądarki obiektów, a także w MSVC 6.0, to pokazuje tylko funkcje wywoływane z określonej funkcji w nie-graficznym rodzaju wyświetlania. Ponadto nie pokazuje funkcji wywoływanej zaczynając od powiedzmy main()
, a następnie funkcji wywoływanych z niej i tak dalej, w głąb funkcji na poziomie liścia.
Potrzebuję narzędzia, które da mi obrazowy wykres wywołań funkcji z funkcjami callee
i caller
połączony strzałkami lub czymś w tym rodzaju, zaczynając od main()
ostatniego poziomu funkcji lub przynajmniej przedstawiający graficznie wykres wywołań wszystkich funkcji w jednym pliku źródłowym C. Byłoby wspaniale, gdybym mógł wydrukować ten wykres.
Jakieś dobre narzędzia do tego (nie muszą to być darmowe narzędzia)?
źródło
Odpowiedzi:
Egipt (bezpłatne oprogramowanie)
ncc
KcacheGrind (GPL)
Graphviz (CPL)
CodeViz (GPL)
źródło
Metody analizy dynamicznej
Tutaj opiszę kilka metod analizy dynamicznej.
Metody dynamiczne faktycznie uruchamiają program w celu określenia wykresu wywołania.
Przeciwieństwem metod dynamicznych są metody statyczne, które próbują określić je z samego źródła, bez uruchamiania programu.
Zalety metod dynamicznych:
Wady metod dynamicznych:
KcacheGrind
https://kcachegrind.github.io/html/Home.html
Program testowy:
Stosowanie:
Jesteś teraz w niesamowitym programie GUI, który zawiera wiele interesujących danych dotyczących wydajności.
W prawym dolnym rogu wybierz kartę „Wykres połączeń”. Pokazuje interaktywny wykres wywołań, który jest skorelowany z metrykami wydajności w innych oknach po kliknięciu funkcji.
Aby wyeksportować wykres, kliknij go prawym przyciskiem myszy i wybierz „Eksportuj wykres”. Wyeksportowany plik PNG wygląda następująco:
Z tego widać, że:
_start
, który jest faktycznym punktem wejścia ELF i zawiera konfigurację standardową biblioteki glibcf0
,f1
If2
są nazywane zgodnie z oczekiwaniami od siebiepointed
jest również wyświetlany, mimo że wywołaliśmy go wskaźnikiem funkcji. Mogłoby nie zostać wywołane, gdybyśmy przekazali argument wiersza poleceń.not_called
nie jest wyświetlany, ponieważ nie został wywołany w przebiegu, ponieważ nie przekazaliśmy dodatkowego argumentu wiersza poleceń.Fajne
valgrind
jest to, że nie wymaga żadnych specjalnych opcji kompilacji.Dlatego możesz go użyć, nawet jeśli nie masz kodu źródłowego, tylko plik wykonywalny.
valgrind
udaje się to zrobić, uruchamiając kod za pośrednictwem lekkiej „maszyny wirtualnej”. Powoduje to również, że wykonywanie jest wyjątkowo wolne w porównaniu do wykonywania natywnego.Jak widać na wykresie, uzyskiwane są również informacje o czasie każdego wywołania funkcji, które można wykorzystać do profilowania programu, co jest prawdopodobnie oryginalnym przypadkiem użycia tej konfiguracji, a nie tylko do wyświetlania wykresów połączeń: Jak mogę profilować Kod C ++ działający w systemie Linux?
Testowane na Ubuntu 18.04.
gcc -finstrument-functions
+ etracehttps://github.com/elcritch/etrace
-finstrument-functions
dodaje wywołania zwrotne , etrace analizuje plik ELF i implementuje wszystkie wywołania zwrotne.Niestety, nie udało mi się go uruchomić: Dlaczego `-finstrument-functions` nie działa dla mnie?
Zgłoszone dane wyjściowe mają format:
Prawdopodobnie najbardziej wydajna metoda poza obsługą specyficznego śledzenia sprzętu, ale ma tę wadę, że trzeba ponownie skompilować kod.
źródło
Zrozum bardzo dobrze tworzy wykresy połączeń.
źródło
Nasz DMS Software Reengineering Toolkit ma statyczną kontrolę / przepływ danych / analizę punktów do / wywołania , która została zastosowana w ogromnych systemach (~ ~ ~ 25 milionów linii) kodu C i stworzyła takie wykresy wywołań, w tym funkcje wywoływane za pomocą wskaźników funkcji .
źródło
Możesz spróbować CScope + tceetree + Graphviz .
źródło
Można sprawdzić moje C wywołania bash generator drzewo oparte tutaj . Pozwala określić jedną lub więcej funkcji C, dla których chcesz uzyskać informacje o dzwoniącym i / lub wywoływanym, lub możesz określić zestaw funkcji i określić wykres osiągalności wywołań funkcji, który je łączy ... To znaczy powiedz mi wszystkie sposoby main ( ), foo () i bar () są połączone. Używa graphviz / dot dla silnika graficznego.
źródło
Astrée to najbardziej solidne i wyrafinowane narzędzie, jakie istnieje, IMHO.
źródło