Генерация графа вызовов для кода 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или что вы хотите сделать с этим.

Вы можете опустить часть регулярного выражения "нельзя начинать со звездочки", чтобы получить некоторое указание и на косвенные вызовы. Вы по-прежнему не сможете сказать, какие функции будут вызываться в этот момент, но, по крайней мере, вы будете знать, что есть еще кое-что, что нужно знать.

Другие вопросы по тегам