Інструменти для отримання графічного коду виклику функції зображень коду [закрито]


107

У мене є великий робочий простір, який містить багато вихідних файлів коду С. Хоча я можу бачити функції, викликані з функції у MS VS2005, за допомогою браузера Object, а також у MSVC 6.0, це показує лише функції, викликані з певної функції в не графічному вигляді дисплея. Крім того, вона не відображає функцію, яку називають починаючи з say main(), а потім функції, викликані від неї, і так далі, глибше всередині функції рівня аркуша.

Мені потрібен інструмент, який надасть мені графік виклику функцій, зображаючи функціями calleeта callerз'єднаний стрілками чи щось подібне, починаючи з main()останнього рівня функції, або принаймні зображаючи графік виклику всіх функцій в одному вихідному файлі C. Було б чудово, якби я змогла надрукувати цей графік.

Будь-які хороші інструменти для цього (не повинні бути безкоштовні інструменти)?


Відповіді:


54

2
запитання про CodeViz, Якщо ви передасте свій код на те, що він буде генерувати код чи ні? Або вам слід зробити графік codevis?
Mohammad Reza Rezwani

5
Я просто спробував Єгипет. Графіка жахлива. Я не впевнений у інших.
ar2015

29

Методи динамічного аналізу

Тут я описую кілька динамічних методів аналізу.

Динамічні методи фактично запускають програму для визначення графіка виклику.

Протилежністю динамічним методам є статичні методи, які намагаються визначити його лише з джерела, не запускаючи програму.

Переваги динамічних методів:

  • ловить покажчики функцій та віртуальних викликів C ++. Вони присутні у великій кількості в будь-якому нетривіальному програмному забезпеченні.

Недоліки динамічних методів:

  • Ви повинні запустити програму, яка може бути повільною або вимагати установки, якої у вас немає, наприклад, перехресна компіляція
  • показуватимуться лише ті функції, які насправді викликали. Наприклад, деякі функції можна викликати чи не залежно від аргументів командного рядка.

KcacheGrind

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

Тестова програма:

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;
}

Використання:

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

Тепер ви залишилися в дивовижній програмі GUI, яка містить безліч цікавих даних про ефективність.

У нижньому правому куті виберіть вкладку «Графік викликів». Це показує графік інтерактивного виклику, який співвідноситься з показниками ефективності в інших вікнах під час натискання функцій.

Щоб експортувати графік, клацніть правою кнопкою миші та виберіть "Експорт графіка". Експортований PNG виглядає приблизно так:

З цього ми бачимо, що:

  • кореневий вузол є _startфактичною точкою входу ELF і містить котло ініціалізації glibc
  • f0, f1і f2називаються так, як очікували одне від одного
  • pointedтакож показано, навіть якщо ми його назвали функцією вказівника. Можливо, його не викликали, якби ми передали аргумент командного рядка.
  • not_called не показано, тому що його не викликали під час запуску, оскільки ми не передали додатковий аргумент командного рядка.

Класна річ у valgrindтому, що вона не потребує спеціальних варіантів компіляції.

Тому ви можете використовувати його, навіть якщо у вас немає вихідного коду, а лише виконуваний файл.

valgrindвдається це зробити, запустивши свій код через легку "віртуальну машину". Це також робить виконання надзвичайно повільним у порівнянні з нативним виконанням.

Як видно на графіку, також отримується інформація про терміни про кожен виклик функції, і це може бути використане для профілювання програми, яка, ймовірно, оригінальний випадок використання цього налаштування, а не просто для перегляду графіків викликів: Як я можу надати профіль Код C ++, що працює в Linux?

Тестовано на Ubuntu 18.04.

gcc -finstrument-functions + етрація

https://github.com/elcritch/etrace

-finstrument-functions додає зворотні дзвінки , etrace аналізує файл ELF та реалізує всі зворотні виклики.

Я, на жаль, не міг змусити його працювати: Чому "-finstrument-функции" не працюють на мене?

Заявлений вихідний формат:

\-- 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

Мабуть, найефективніший метод, окрім конкретної підтримки апаратного відстеження, але має і недолік, який вам доведеться перекомпілювати.


2
Зауважте лише, що графік динамічного виклику охоплює лише один запуск програми.
smwikipedia

1
@smwikipedia так, я вдосконалив відповідь, щоб зробити це зрозумілішим
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Також пояснюється тут - stackoverflow.com/questions/311840 / ...
tauseef_CuriousGuy


9

Наш інструментарій для реінжинірингу програмного забезпечення DMS має статичний аналіз / потік даних / аналіз точок на / виклик графіків , який застосовувався до величезних систем (~ ~ 25 мільйонів рядків) коду С, і створював такі графіки викликів, включаючи функції, викликані за допомогою функціональних покажчиків .


1
Ах, приємно, його 2016 і зараз з'явився низовий потік. Я впевнений, що його голос базувався на точній оцінці, що цей інструмент не може цього зробити. Ну, може, ні. Він впевнено робить те, про що вимагав ОП.
Іра Бакстер

1
Візьміть нагороду для протидії цьому. Мені все одно, що це твоє програмне забезпечення чи патентований
пристрій, поки він виконає


5

Ви можете перевірити мій Баш на основі генератора дерева C виклику тут . Він дозволяє вам вказати одну або кілька функцій C, для яких потрібно викликати інформацію або / або викликати інформацію, або ви можете вказати набір функцій та визначити графік доступності функціональних викликів, який їх з'єднує ... Тобто скажіть мені всі способи головного ( ), foo () та bar () з'єднані. Він використовує графік / крапка для графічного двигуна.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.