Narzędzia do uzyskania graficznego wykresu wywołania funkcji kodu [zamknięty]

Mam dużą przestrzeń roboczą, która ma wiele plików źródłowych kodu C. Chociaż mogę zobaczyć funkcje wywołane z funkcji w MS VS2005 za pomocą przeglądarki obiektów, a także w MSVC 6.0 również, to pokazuje tylko funkcje wywołane z konkretnej funkcji w nie-graficznym rodzaju wyświetlacza. Dodatkowo nie pokazuje funkcji wywołanej począwszy od say main(), a następnie funkcji wywołanych z niej, i tak dalej, głębiej wewnątrz funkcji poziomu liścia.

Potrzebuję narzędzia, które da mi Wykres wywołania funkcji obrazowo z funkcjami callee i caller połączonymi strzałkami lub czymś w tym stylu, zaczynając od main() do ostatniego poziomu funkcji, lub przynajmniej pokazując Wykres wywołania wszystkich funkcji w jednym pliku źródłowym C obrazowo. Byłoby świetnie, gdybym mógł wydrukować ten wykres.

Jakieś dobre narzędzia do tego (nie muszą być wolnymi narzędziami)?

Author: Lightness Races in Orbit, 2009-02-05

8 answers

 47
Author: philant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-18 18:25:11

Doxygen (w połączeniu z graphviz) może generować wykresy wywołania.

 26
Author: finnw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-05 19:49:46

Metody analizy dynamicznej

Tutaj opiszę kilka metod analizy dynamicznej.

Dynamiczne metody 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:

  • łapie Wskaźniki funkcji i wirtualne wywołania C++. Są one obecne w dużych ilościach w każdym nietrywialnym oprogramowanie.

Wady metod dynamicznych:

  • musisz uruchomić program, który może być powolny lub wymagać konfiguracji, której nie masz, np. cross-compilation
  • pokażą się tylko funkcje, które zostały faktycznie wywołane. Na przykład, niektóre funkcje mogą być wywoływane lub nie w zależności od argumentów wiersza poleceń.

KcacheGrind

Https://kcachegrind.github.io/html/Home.html

Test program:

int f2(int i) { return i + 2; }
int f1(int i) { return f2(2) + i + 1; }
int f0(int i) { return f1(1) + f2(2); }
int pointed(int i) { return i; }
int not_called(int i) { return 0; }

int main(int argc, char **argv) {
    int (*f)(int);
    f0(1);
    f1(1);
    f = pointed;
    if (argc == 1)
        f(1);
    if (argc == 2)
        not_called(1);
    return 0;
}

Użycie:

sudo apt-get install -y kcachegrind valgrind

# Compile the program as usual, no special flags.
gcc -ggdb3 -O0 -o main -std=c99 main.c

# Generate a callgrind.out.<PID> file.
valgrind --tool=callgrind ./main

# Open a GUI tool to visualize callgrind data.
kcachegrind callgrind.out.1234

Zostajesz teraz w niesamowitym programie graficznym, który zawiera wiele interesujących danych o wydajności.

W prawym dolnym rogu wybierz zakładkę "Call graph". To pokazuje interaktywny wykres połączeń, który koreluje z metrykami wydajności w innych oknach podczas klikania funkcji.

Aby wyeksportować Wykres, kliknij go prawym przyciskiem myszy i wybierz "Eksportuj Wykres". Wyeksportowany PNG wygląda jak to:

Z tego widać, że:

    Jest to węzeł główny
  • , który jest faktycznym punktem wejścia ELF i zawiera kocioł inicjalizacji glibc
  • f0, f1 i f2 są wywoływane zgodnie z oczekiwaniami od siebie
  • pointed jest również pokazana, mimo że nazwaliśmy ją wskaźnikiem funkcji. Może nie zostać wywołana, gdybyśmy przekazali argument wiersza poleceń.
  • not_called nie jest wyświetlany, ponieważ nie został wywołany w uruchomieniu, ponieważ nie przekazaliśmy dodatkowego argumentu wiersza poleceń.

Najfajniejsze w valgrind jest to, że nie wymaga żadnych specjalnych opcji kompilacji.

Dlatego możesz go używać nawet jeśli nie masz kodu źródłowego, tylko wykonywalnego.

valgrind udaje się to zrobić, uruchamiając kod za pomocą lekkiej "maszyny wirtualnej".

Testowane na Ubuntu 18.04.

gcc -finstrument-functions + etrace

Https://github.com/elcritch/etrace

-finstrument-functions dodaje wywołania zwrotne , etrace przetwarza plik ELF i implementuje wszystkie wywołania zwrotne.

Niestety nie udało mi się go uruchomić: dlaczego `-finstrument-functions` nie działa dla mnie?

Deklarowane wyjście ma format:

\-- main
|   \-- Crumble_make_apple_crumble
|   |   \-- Crumble_buy_stuff
|   |   |   \-- Crumble_buy
|   |   |   \-- Crumble_buy
|   |   |   \-- Crumble_buy
|   |   |   \-- Crumble_buy
|   |   |   \-- Crumble_buy
|   |   \-- Crumble_prepare_apples
|   |   |   \-- Crumble_skin_and_dice
|   |   \-- Crumble_mix
|   |   \-- Crumble_finalize
|   |   |   \-- Crumble_put
|   |   |   \-- Crumble_put
|   |   \-- Crumble_cook
|   |   |   \-- Crumble_put
|   |   |   \-- Crumble_bake

Prawdopodobnie najbardziej wydajna metoda oprócz obsługi konkretnego śledzenia sprzętowego, ale ma tę zaletę, że musisz przekompilować kod.

 24
Author: Ciro Santilli 新疆改造中心 六四事件 法轮功,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-30 14:18:47

Understand robi bardzo dobrą robotę tworzenia wykresów połączeń.

 15
Author: MattK,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-05 19:49:49

Możesz spróbować CScope + tceetree + Graphviz .

 6
Author: Fabio Visona',
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-21 21:26:35

Nasz DMS Software Reengineering Toolkit posiada static control/dataflow/points-to/call graph analysis, która została zastosowana do ogromnych systemów (~~25 milionów linii) kodu C i wyprodukowała takie wykresy wywołania, łącznie z funkcjami wywoływanymi przez Wskaźniki funkcji.

 5
Author: Ira Baxter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-18 18:32:41

Możesz sprawdzić mój bazujący na bash generator drzewa wywołań C tutaj . Pozwala określić jedną lub więcej funkcji C, dla których chcesz wywołać i/lub wywołać informacje, lub można określić zestaw funkcji i określić Wykres osiągalności wywołań funkcji, które je łączą... Czyli powiedz mi wszystkie sposoby połączenia main(), foo() i bar (). Wykorzystuje graphviz/dot dla silnika graficznego.

 4
Author: Jason Nyberg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-03 03:42:16

Astrée jest najbardziej wytrzymałym i wyrafinowanym narzędziem, IMHO.

 3
Author: ЯegDwight,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-26 10:42:13