Инструменты для получения графического графика вызова функции кода

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

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

Любые хорошие инструменты для этого (необязательно, бесплатные инструменты)?

Ответ 2

doxygen (в сочетании с graphviz) может генерировать графики вызовов.

Ответ 3

KCacheGrind

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

Использование:

sudo apt-get install -y kcachegrind valgrind
gcc main.c
valgrind --tool=callgrind ./a.out
# Generates a callgrind.out.<PID> file.
kcachegrind callgrind.out.1234
# Opens a GUI to visualize callgrind data.

Пример изображения графика, экспортированного в мирную программу hello:

0awzU.png

Этот метод имеет то преимущество, что вам не нужен исходный код, чтобы увидеть график вызовов, только исполняемый файл.

Он выполняет программу и отмечает, когда функция вызывается из другого, так называемый динамический анализ, в отличие от статического анализа, который анализирует исходный код без его запуска.

Неграфическая версия этого вопроса: Инструмент для отслеживания локальных вызовов функций в Linux cflow - это приятный упрощенный вариант.

gcc -finstrument-functions + etrace

https://github.com/elcritch/etrace

-finstrument-functions добавляет обратные вызовы, etrace выравнивает ELF файл и реализует все обратные вызовы.

Я не мог заставить его работать, к сожалению: Почему для меня не работают` -finstrument-functions`?

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

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

Вероятнее всего, самый эффективный метод, помимо конкретной поддержки аппаратного трассировки, но имеет недостаток, что вам нужно перекомпилировать код.

Ответ 4

Understand делает очень хорошую работу по созданию графиков вызовов.

Ответ 5

Вы можете попробовать CScope + tceetree + Graphviz.

Ответ 7

Вы можете проверить мой генератор дерева вызовов C bash на основе здесь. Он позволяет указать одну или несколько C-функций, для которых вы хотите получить информацию о вызывающем абоненте и/или вызываемой информации, или вы можете указать набор функций и определить график достижимости вызовов функций, который их связывает... I.e. скажите мне все пути main(), foo() и bar(). Он использует graphviz/dot для графического движка.

Ответ 8

Astrée - самый надежный и изощренный инструмент там, IMHO.