Генерация графа вызовов для кода C
Я пишу инструмент, и мне нужно сгенерировать callgraph для некоторых проектов на Си. Мне удалось создать граф вызовов из одного файла с помощью clang, но я не смог выяснить, как генерировать граф вызовов для всего проекта, который содержит десятки заголовочных и исходных файлов.
Подойдет любой инструмент, который может сгенерировать вызовграф в файл, который можно проанализировать. Полезная библиотека будет лучше.
2 ответа
Также стоит упомянуть отличный GNU cflow:
GNU cflow анализирует коллекцию исходных файлов на языке C и печатает график, отображающий поток управления в программе.
GNU cflow может создавать как прямые, так и инвертированные потоковые диаграммы для C-источников. При желании может быть создан список перекрестных ссылок. Реализуются два выходных формата: POSIX и GNU (расширенный).
Входные файлы могут быть предварительно обработаны перед анализом.
редактировать
Что касается запроса библиотеки. Вы могли бы "настроить" output.c
и вместо печати делай что-то еще с данными. Внутренний поток организован в выходные обработчики, так что я думаю, что написание собственного обработчика уже может помочь. Это не из коробки, хотя.
Превращаю мой комментарий в ответ.
Вы можете взглянуть на вывод сборки и обработать ее с помощью скрипта. Предполагая, что GCC на Linux, вы передаете -S
флаг для gcc
и обработать результат примерно так:
perl -ne '/^([^. \t#].*):/ and $f=$1;/call\s+([^*]\S*)/ and print "$f -> $1\n";' *.S
Это даст вам строку для каждого статического вызова, содержащую вызывающую и вызываемую функцию. Вы можете добавить немного шаблона вокруг этого и передать результат dot
или что вы хотите сделать с этим.
Вы можете опустить часть регулярного выражения "нельзя начинать со звездочки", чтобы получить некоторое указание и на косвенные вызовы. Вы по-прежнему не сможете сказать, какие функции будут вызываться в этот момент, но, по крайней мере, вы будете знать, что есть еще кое-что, что нужно знать.