График звонков - Википедия - Call graph

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

А график звонков (также известный как вызвать мультиграф[1][2]) это граф потока управления,[3] который представляет собой вызывающие отношения между подпрограммы в компьютерная программа. Каждый узел представляет процедуру и каждое ребро (е, г) указывает, что процедура ж вызывает процедуру грамм. Таким образом, цикл в графе обозначает рекурсивные вызовы процедур.

Базовые концепты

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

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

С языками, которые имеют динамическая отправка, Такие как Ява и C ++ для точного вычисления статического графа вызовов требуется анализ псевдонимов полученные результаты.[5] И наоборот, для вычисления точного алиасинга требуется граф вызовов. Многие системы статического анализа решают очевидную бесконечную регрессию, вычисляя и то, и другое одновременно.

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

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

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

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

График вызовов во время выполнения (большинство перечисленных инструментов являются профилировщиками с функциями графа вызовов)
  • гпроф : входит в состав BSD или является частью Двоичные утилиты GNU
  • callgrind: часть Валгринд
  • KCachegrind : мощный инструмент для создания и анализа графиков вызовов на основе данных, созданных callgrind
  • Монитор активности Mac OS X: Монитор процессов с графическим интерфейсом пользователя Apple Activity Monitor имеет встроенный генератор графа вызовов, который может выполнять выборку процессов и возвращать граф вызовов. Эта функция доступна только в Mac OS X Леопард
  • OpenPAT: включает control_flow инструмент, который автоматически создает Graphviz изображение графика вызовов из измерений времени выполнения.
  • pprof, инструмент с открытым исходным кодом для визуализации и анализа данных профиля, который будет использоваться вместе с gperftools.
  • CodeAnalyst из AMD (выпущен под GPL)
  • makeppgraph генератор графов зависимостей (на уровне модуля) для сборок, выполняемых с makepp.
  • Intel (R) Single Event API (бесплатно, с открытым исходным кодом)
Статический (для языка C), для получения графиков вызовов без запуска приложения
  • доксиген : Использует графвиз для создания статических диаграмм вызовов / наследования
  • поток : GNU cflow может генерировать прямой и инвертированный граф вызовов программы на C
  • Египет : маленький Perl скрипт, использующий gcc и Graphviz для создания статического графа вызовов программы C.
  • Analizo: рассчитывает метрики исходного кода, строит графики зависимостей.
  • CCTree : Родные Vim плагин, который может отображать статические графики вызовов, читая cscope база данных. Работает для программ C.
  • Codeviz : генератор статического графа вызовов (программа нет пробег). Реализован как патч к gcc; работает для программ на C и C ++.
  • calltree.sh : Функции оболочки Bash, которые объединяют cscope, graphviz и набор инструментов точечного рендеринга для отображения отношений «вызывающий» и «вызываемый» выше, ниже и / или между указанными вами функциями C.
  • Tceetree : как и calltree.sh, он подключает Cscope и Graphviz, но это скорее исполняемый файл, чем сценарий bash.
Идти
  • Go-Callvis : интерактивный генератор графа вызовов для программ Go, вывод которых можно нарисовать с помощью Graphviz
.Сеть
  • NDepend : это инструмент статического анализа кода .Net. Этот инструмент поддерживает большое количество метрик кода, позволяет визуализировать зависимости с помощью ориентированных графов и матрицы зависимостей.
PHP, Perl и Python
  • Devel :: NYTProf : анализатор производительности Perl и генератор диаграмм вызовов
  • phpCallGraph : генератор графа вызовов для программ PHP, использующий Graphviz. Он написан на PHP и требует как минимум PHP 5.2.
  • пикалграф : генератор графа вызовов для программ Python, который использует Graphviz.
  • Пьян : генератор статического графа вызовов для программ Python, который использует Graphviz.
  • gprof2dot : Генератор графа вызовов, написанный на Python, который преобразует данные профилирования для многих языков / сред выполнения в Graphviz callgraph.
  • code2flow: Генератор графа вызовов для программ Python и Javascript, который использует Graphviz
  • rcviz : Модуль Python для рендеринга графиков вызовов, сгенерированных во время выполнения, с Graphviz. Каждый узел представляет собой вызов функции с переданными ей параметрами и возвращаемым значением.
XQuery

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

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

Прочие сопутствующие инструменты

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

Пример графика

Пример графика звонков, созданный из гпроф анализируя себя:

индекс с именем имя | индекс с именем имя 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] |

Смотрите также

Рекомендации

  1. ^ Callahan, D .; Carle, A .; Холл, M.W .; Кеннеди, К. (апрель 1990 г.). «Построение мультиграфа вызова процедуры». IEEE Transactions по разработке программного обеспечения. 16 (4): 483–487. Дои:10.1109/32.54302.
  2. ^ Удай Хедкер; Амитабха Саньял; Багешри Сате (2009). Анализ потока данных: теория и практика. CRC Press. п. 234. ISBN  978-0-8493-3251-7.
  3. ^ Панкадж Джалоте (1997). Комплексный подход к разработке программного обеспечения. Springer Science & Business Media. п.372. ISBN  978-0-387-94899-7.
  4. ^ Райдер, Б.Г. (Май 1979 г.). «Построение графа вызовов программы». IEEE Transactions по разработке программного обеспечения. SE-5 (3): 216–226. Дои:10.1109 / цэ.1979.234183.
  5. ^ Гроув, Дэвид; ДеФоу, Грег; Дин, Джеффри; Чемберс, Крейг; Гроув, Дэвид; ДеФоу, Грег; Дин, Джеффри; Чемберс, Крейг (9 октября 1997 г.). «Построение графа вызовов в объектно-ориентированных языках». Уведомления ACM SIGPLAN. ACM. 32 (10): 108, 108–124, 124. Дои:10.1145/263700.264352.
  6. ^ Eisenbarth, T .; Koschke, R .; Саймон, Д. (2001). «Помощь в понимании программ с помощью статического и динамического анализа функций». Труды Международной конференции по сопровождению программного обеспечения IEEE. ICSM 2001: 602–611. Дои:10.1109 / icsm.2001.972777. ISBN  0-7695-1189-9.
  7. ^ Муско, Винченцо; Монперрус, Мартин; Preux, Philippe (26 июля 2016 г.). «Крупномасштабное исследование прогнозирования воздействия на основе графа вызовов с использованием мутационного тестирования». Журнал качества программного обеспечения. 25 (3): 921–950. arXiv:1812.06286. Дои:10.1007 / s11219-016-9332-8.
  8. ^ Гао, Дебин; Рейтер, Майкл К .; Песня, Рассвет (25 октября 2004 г.). «Серый ящик извлечения графиков выполнения для обнаружения аномалий». Материалы 11-й конференции ACM по компьютерной и коммуникационной безопасности - CCS '04. ACM. С. 318–329. Дои:10.1145/1030083.1030126. ISBN  1581139616.