Найти количество вызовов функций / макросов при макросе времени компиляции - PullRequest
1 голос
/ 08 мая 2011

У меня проблема с тем, что мне нужно найти, сколько раз конкретный макрос / функция вызывается в моем коде?Я знаю, вы можете подумать, почему я не запускаю поиск / grep.Но моя проблема в том, что вызываемая функция / макрос находится под определенным макросом времени компиляции.Поэтому я хотел бы узнать количество вызовов, только когда этот конкретный макрос времени компиляции включен.И я хочу найти количество вызовов во всем коде (статический анализ, а не время выполнения).Кодовая база довольно велика (миллионы строк кода) и полностью написана на C в Linux.Я пытался использовать readelf, но я не мог извлечь необходимую информацию.Любая помощь будет принята с благодарностью.

Спасибо заранее.~ N

Ответы [ 2 ]

2 голосов
/ 08 мая 2011

Многие компиляторы C имеют флаг для вывода промежуточного вывода этапа препроцессора (с определенными соответствующими символами условной компиляции). Затем вы можете запустить find / grep для этого вывода.

0 голосов
/ 08 мая 2011

Как насчет встраивания какого-либо уникального слова (например, MARKER в следующем) в указанный макрос и подсчета количества раз, которое слово появляется?
Например, предполагая код a.c, подобный следующему:

#define A f() MARKER
#define B A; A;
B

Счетчик появления маркера будет получен с помощью следующих команд:

gcc -E a.c | sed -r 's/[^A-Za-z0-9_]+/\xa/g' | grep MARKER | wc -l

После измерения необходимо удалить MARKER в макросе или#define d, чтобы очистить как:

#define MARKER

РЕДАКТИРОВАТЬ: Если ваша система сборки make, вам может потребоваться добавить новое правило, подобное следующему, в ваши текущие make-файлыкак сделать предварительно обработанный файл:

SRCS = a.c

preprocessed: $(SRCS:.c=.i)

%.i: %.c
    $(CC) -E $(CPPFLAGS) -o $@ $<

Если все настройки были выполнены правильно, с помощью команд make preprocessed и find -type f -name '*.i' или аналогичных, будут получены все предварительно обработанные файлы.Возможно, это нелегкая работа.Если вы столкнулись с трудностями, я бы предложил опубликовать это как новый вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...