Ответ 1
-
Egypt (бесплатное программное обеспечение)
-
KcacheGrind (GPL)
-
Graphviz (CPL)
-
CodeViz (GPL)
У меня есть большое рабочее пространство, в котором есть много исходных файлов кода C. Хотя я могу видеть функции, вызванные функцией в MS VS2005, используя браузер объектов, а также в MSVC 6.0, это показывает только функции, вызываемые из определенной функции в неграфическом виде отображения. Кроме того, он не показывает функцию, называемую начиная с say main()
, а затем вызываемые из нее функции и т.д. Глубже внутри функции уровня листа.
Мне нужен инструмент, который графически отобразит график функций с функциями callee
и caller
, связанными стрелками или чем-то подобным, начиная с main()
до последнего уровня функции или, по крайней мере, показывая диаграмму вызова всех функций в одном исходном файле C наглядно. Было бы здорово, если бы я смог распечатать этот график.
Любые хорошие инструменты для этого (необязательно, бесплатные инструменты)?
Egypt (бесплатное программное обеспечение)
KcacheGrind (GPL)
Graphviz (CPL)
CodeViz (GPL)
doxygen (в сочетании с graphviz) может генерировать графики вызовов.
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:
Этот метод имеет то преимущество, что вам не нужен исходный код, чтобы увидеть график вызовов, только исполняемый файл.
Он выполняет программу и отмечает, когда функция вызывается из другого, так называемый динамический анализ, в отличие от статического анализа, который анализирует исходный код без его запуска.
Неграфическая версия этого вопроса: Инструмент для отслеживания локальных вызовов функций в 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
Вероятнее всего, самый эффективный метод, помимо конкретной поддержки аппаратного трассировки, но имеет недостаток, что вам нужно перекомпилировать код.
Understand делает очень хорошую работу по созданию графиков вызовов.
Наш DMS Software Reengineering Toolkit статический контроль/поток данных/точки- to/call graph, который применялся к огромным системам (~ ~ 25 миллионов строк) кода C и создавал такие графики вызовов, включая функции, называемые с помощью указателей функций.
Вы можете проверить мой генератор дерева вызовов C bash на основе здесь. Он позволяет указать одну или несколько C-функций, для которых вы хотите получить информацию о вызывающем абоненте и/или вызываемой информации, или вы можете указать набор функций и определить график достижимости вызовов функций, который их связывает... I.e. скажите мне все пути main(), foo() и bar(). Он использует graphviz/dot для графического движка.
Astrée - самый надежный и изощренный инструмент там, IMHO.