Граф вызовов

редактировать
Граф вызовов, созданный для простой компьютерной программы на Python.

A граф вызовов (также известный как call multigraph ) - это граф потока управления, который представляет отношения вызовов между подпрограммами в компьютерной программе. Каждый узел представляет процедуру, и каждое ребро (f, g) указывает, что процедура f вызывает процедуру g. Таким образом, цикл на графике указывает на рекурсивные вызовы процедур.

Содержание
  • 1 Основные понятия
  • 2 Использование
  • 3 Программное обеспечение
    • 3.1 Бесплатные программные генераторы графов вызовов
    • 3.2 Собственные генераторы графов вызовов
    • 3.3 Другие сопутствующие инструменты
  • 4 Пример графика
  • 5 См. Также
  • 6 Ссылки
Основные понятия

Графики вызовов могут быть динамическими или статическими. Граф динамических вызовов - это запись выполнения программы, например, вывод профилировщика. Таким образом, динамический граф вызовов может быть точным, но описывает только один запуск программы. Статический граф вызовов - это граф вызовов, предназначенный для представления всех возможных запусков программы. Точный статический граф вызовов - это неразрешимая проблема, поэтому алгоритмы статического графа вызовов обычно являются чрезмерными приближениями. То есть каждая возникающая взаимосвязь вызовов представлена ​​на графике и, возможно, также некоторые взаимосвязи вызовов, которые никогда не возникли бы при реальных запусках программы.

Графы вызовов могут быть определены для представления различной степени точности. Более точный график вызовов более точно приближает поведение реальной программы за счет увеличения времени на вычисления и большего объема памяти для хранения. Наиболее точный граф вызовов полностью контекстно-зависимый, что означает, что для каждой процедуры граф содержит отдельный узел для каждого стека вызовов, с помощью которого процедура может быть активирована. Полностью контекстно-зависимый граф вызовов называется. Его можно легко вычислить динамически, хотя это может занять большой объем памяти. Деревья контекстов вызова обычно не вычисляются статически, потому что для большой программы это займет слишком много времени. Наименее точный граф вызовов не зависит от контекста, что означает, что для каждой процедуры существует только один узел.

Для языков с функцией динамической диспетчеризации, таких как Java и C ++, для вычисления статического графа вызовов точно требуется анализ псевдонимов результаты. И наоборот, для вычисления точного алиасинга требуется граф вызовов. Многие системы статического анализа решают очевидную бесконечную регрессию, вычисляя и то, и другое одновременно.

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

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

Программное обеспечение

Бесплатное программное обеспечение Генераторы графов вызовов

Граф вызовов во время выполнения (перечислено большинство инструментов профилировщики с функцией графа вызовов)
  • gprof : включен в BSD или является частью GNU Binary Utilities
  • callgrind: частью Valgrind
  • KCachegrind : мощный инструмент для создания и анализировать графики вызовов на основе данных, сгенерированных callgrind
  • Mac OS X Activity Monitor: Монитор процессов Apple GUI Activity Monitor имеет встроенный генератор графов вызовов, который может выбирать процессы и возвращать график вызовов. Эта функция доступна только в Mac OS X Leopard
  • OpenPAT: включает инструмент control_flow, который автоматически создает изображение графика вызовов Graphviz из измерения времени выполнения.
  • pprof, инструмент с открытым исходным кодом для визуализации и анализа данных профиля, который будет использоваться вместе с gperftools.
  • CodeAnalyst от AMD (выпущен под GPL)
  • makeppgraph - генератор графа зависимостей (на уровне модуля) для сборок, выполняемых с помощью makepp.
  • Intel (R) Single Event API (бесплатно, с открытым исходным кодом)
Статический (для языка C), для получения графиков вызовов без запущенного приложения
  • doxygen : использует graphviz для создания статических диаграмм вызовов / наследования
  • cflow : GNU cflow может сгенерировать прямой и инвертированный граф вызовов программы C
  • egypt : небольшой сценарий Perl, который использует gcc и Graphviz для создания статического графа вызовов программы C.
  • Analizo : вычисляет метрики исходного кода, генерирует зависимости y графиков.
  • CCTree : собственный плагин, который может отображать статические графики вызовов, читая базу данных cscope. Работает для программ на языке C.
  • codeviz : генератор статического графа вызовов (программа не запускается). Реализован как патч для gcc ; работает для программ C и C ++.
  • calltree.sh : функции оболочки Bash, которые объединяют cscope, graphviz и набор инструментов точечного рендеринга для отображения отношений «вызывающий» и «вызываемый» выше, ниже и / или между указанными вами функциями C.
  • tceetree : как и calltree.sh, он соединяет Cscope и Graphviz, но это исполняемый файл, а не сценарий bash.
Go
  • go-callvis : генератор интерактивного графа вызовов для программ Go, вывод которых может быть нарисован с помощью Graphviz
.Net
  • NDepend : инструмент статического анализа для.Net код. Этот инструмент поддерживает большое количество показателей кода, позволяет визуализировать зависимости с помощью ориентированных графиков и матрицы зависимостей.
PHP, Perl и Python
  • Devel :: NYTProf : анализатор производительности Perl и генератор диаграмм вызовов
  • phpCallGraph : генератор графа вызовов для программ PHP, использующий Graphviz. Он написан на PHP и требует как минимум PHP 5.2.
  • pycallgraph : генератор графа вызовов для программ Python, который использует Graphviz.
  • pyan : генератор статического графа вызовов для программ Python, которые использует Graphviz.
  • gprof2dot : генератор графа вызовов, написанный на Python, который преобразует данные профилирования для многих языков / сред выполнения в граф вызовов Graphviz.
  • code2flow : вызов генератор графиков для программ Python и Javascript, использующих Graphviz
  • rcviz : модуль Python для визуализации графиков вызовов, сгенерированных во время выполнения, с помощью Graphviz. Каждый узел представляет собой вызов функции с переданными ей параметрами и возвращаемым значением.
XQuery

Собственные генераторы графа вызовов

Анализатор статического кода и генератор графа вызовов для кода Visual Basic
Visual Expert
Анализатор статического кода и генератор графа вызовов для Oracle PL / SQL, SQLServer Transact-SQL, C# и PowerBuilder code
Intel VTune Performance Analyzer
Инструментальный профилировщик для отображения графика вызовов и статистики выполнения
DMS Software Reengineering Toolkit
Настраиваемый инструмент анализа программ со статическим извлечением глобального графа вызовов для всей программы для C, Java и COBOL

Другие сопутствующие инструменты

Graphviz
Превращает текстовое представление любого графа (включая граф вызовов) в изображение.
Образец графа

Образец графа вызовов, созданный из gprof ana анализирует себя:

индекс с именем имя | индекс с именем имя 72384/72384 sym_id_parse [54] | 1508/1508 cg_dfn [15] [3] 72384 совпадение [3] | [13] 1508 pre_visit [13] ---------------------- | --- ------------------- 4/9052 cg_tally [32] | 1508/1508 cg_assemble [38] 3016/9052 hist_print [49] | [14] 1508 spread_time [14] 6032/9052 spread_flags [52] | ------------------- --- [4] 9052 sym_lookup [4] | 2 cg_dfn [15] ---------------------- | 1507/1507 cg_assemble [38] 5766/5766 core_create_function_syms [41] | [15] 1507 + 2 cg_dfn [15] [5] 5766 core_sym_class [5] | 1509/1509 имеет_номер [9] ---------------------- | 1508/1508 is_busy [11] 24/1537 parse_spec [19] | 1508/1508 pre_visit [13] 1513/1537 core_create_function_syms [41] | 1508/1508 post_visit [12] [6] 1537 sym_init [6] | 2 cg_dfn [15] ---------------------- | ---------------------- 1511/1511 core_create_function_syms [41] | 1505/1505 hist_print [49] [7] 1511 get_src_info [7] | [16] 1505 print_line [16] ---------------------- | 2/9 print_name_only [25] 2/1510 arc_add [31] | ---------------------- 1508/1510 cg_assemble [38] | 1430/1430 core_create_function_syms [41] [8] 1510 arc_lookup [8] | [17] 1430 путь_просмотра_источника [17] ---------------------- | --- ------------------- 1509/1509 cg_dfn [15] | 24/24 sym_id_parse [54] [9] 1509 is_numbered [9] | [18] 24 parse_id [18] ---------------------- | 24/24 parse_spec [19] 1508/1508 spread_flags [52] | ---------------------- [10] 1508 inherit_flags [10] | 24/24 parse_id [18] ---------------------- | [19] 24 parse_spec [19] 1508/1508 cg_dfn [15] | 24/1537 sym_init [6] [11] 1508 is_busy [11] | ---------------------- ------------ ---------- | 24/24 основной [1210] 1508/1508 cg_dfn [15] | [20] 24 sym_id_add [20] [12] 1508 post_visit [12] |
См. Также
Ссылки
Последняя правка сделана 2021-05-14 14:43:35
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте