У меня большое рабочее пространство с множеством исходных файлов кода C. Хотя я могу видеть функции, вызываемые из функции в MS VS2005 с помощью обозревателя объектов, а также в MSVC 6.0, здесь отображаются только функции, вызываемые из конкретной функции, в неграфическом виде. Кроме того, он не показывает функцию, вызываемую, скажем main()
, начиная с , а затем функции, вызываемые из нее, и так далее, глубже до функции конечного уровня.
Мне нужен инструмент, который наглядно даст мне график вызовов функций с функциями callee
и caller
соединен стрелками или чем-то в этом роде, начиная с main()
последнего уровня функции, или, по крайней мере, наглядно покажет граф вызовов всех функций в одном исходном файле C. Было бы здорово, если бы я мог распечатать этот график.
Есть ли для этого хорошие инструменты (не обязательно бесплатные)?
источник
Ответы:
Египет (бесплатное программное обеспечение)
NCC
KcacheGrind (GPL)
Графвиз (CPL)
CodeViz (GPL)
источник
Методы динамического анализа
Здесь я описываю несколько методов динамического анализа.
Динамические методы фактически запускают программу для определения графа вызовов.
Противоположностью динамическим методам являются статические методы, которые пытаются определить его только из источника, не запуская программу.
Преимущества динамических методов:
Недостатки динамических методов:
KcacheGrind
https://kcachegrind.github.io/html/Home.html
Программа испытаний:
Использование:
Теперь вы остались внутри замечательной программы с графическим интерфейсом, которая содержит много интересных данных о производительности.
В правом нижнем углу выберите вкладку «График звонков». Это показывает интерактивный график вызовов, который коррелирует с показателями производительности в других окнах, когда вы щелкаете функции.
Чтобы экспортировать график, щелкните его правой кнопкой мыши и выберите «Экспорт графика». Экспортированный PNG выглядит так:
Из этого мы видим, что:
_start
, который является фактической точкой входа ELF и содержит шаблон инициализации glibcf0
,f1
иf2
вызываются, как и ожидалось друг от другаpointed
также отображается, хотя мы вызывали его с помощью указателя на функцию. Он мог бы не быть вызван, если бы мы передали аргумент командной строки.not_called
не отображается, потому что он не был вызван при выполнении, потому что мы не передали дополнительный аргумент командной строки.Крутая вещь о
valgrind
что он не требует никаких специальных параметров компиляции.Таким образом, вы можете использовать его, даже если у вас нет исходного кода, только исполняемый файл.
valgrind
удается сделать это, запустив ваш код через легкую «виртуальную машину». Это также делает выполнение чрезвычайно медленным по сравнению с собственным исполнением.Как видно на графике, также получается информация о времени для каждого вызова функции, и ее можно использовать для профилирования программы, что, вероятно, является исходным вариантом использования этой настройки, а не только для просмотра графиков вызовов: Как я могу профилировать Код на C ++ работает в Linux?
Проверено на Ubuntu 18.04.
gcc -finstrument-functions
+ etracehttps://github.com/elcritch/etrace
-finstrument-functions
добавляет обратные вызовы , etrace анализирует файл ELF и реализует все обратные вызовы.К сожалению, я не смог заставить его работать: почему у меня не работает `-finstrument-functions`?
Заявленный вывод имеет формат:
Вероятно, это наиболее эффективный метод, помимо поддержки конкретной аппаратной трассировки, но имеет обратную сторону: вам придется перекомпилировать код.
источник
Understand очень хорошо справляется с созданием графиков звонков.
источник
В нашем DMS Software Reengineering Toolkit есть статический анализ графов управления / потоков данных / точек для / вызовов , который был применен к огромным системам (~ ~ 25 миллионов строк) кода C, и создал такие графы вызовов, включая функции, вызываемые через указатели функций .
источник
Вы можете попробовать CScope + tceetree + Graphviz .
источник
Вы можете ознакомиться с моим генератором дерева вызовов C на основе bash здесь . Он позволяет вам указать одну или несколько функций C, для которых вы хотите получить информацию о вызывающем и / или вызываемом, или вы можете указать набор функций и определить график достижимости вызовов функций, которые их соединяют ... Т.е. расскажите мне все способы main ( ), foo () и bar () связаны. Он использует graphviz / dot для графического движка.
источник
ИМХО, Astrée - самый надежный и изощренный инструмент.
источник