#c #function #macros
#c #функция #макросы
Вопрос:
У меня такая проблема, что я должен определить, сколько раз конкретный макрос / функция вызывается в моем коде? Я знаю, вы можете подумать, почему я не запускаю find / grep. Но моя проблема в том, что вызываемая функция / макрос выполняется в рамках определенного макроса времени компиляции. Поэтому я хотел бы найти количество вызовов только тогда, когда включен этот конкретный макрос во время компиляции. И я хочу найти количество вызовов во всем коде (статический анализ, а не время выполнения). Кодовая база довольно огромна (миллионы строк кода) и полностью написана на C в Linux. Я пытался использовать readelf, но на самом деле не смог извлечь необходимую информацию. Любая помощь была бы высоко оценена.
Заранее спасибо. ~N
Ответ №1:
Многие компиляторы C имеют флаг для вывода промежуточных выходных данных этапа предварительного процессора (с определенными соответствующими условными символами компиляции). Затем вы могли бы запустить find / grep для этого вывода.
Ответ №2:
Как насчет встраивания некоторого уникального слова (как 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'
или аналогичных
при выполнении команды будут получены все предварительно обработанные файлы.
Вероятно, это непростая работа.
Если вы столкнулись с трудностями,
Я бы предложил опубликовать это как новый вопрос.
Комментарии:
1. Большое спасибо Ise, я тоже думал об этом подходе, но не смог его использовать, поскольку не смог запустить «gcc -E test.c -o test.i» для файлов.. Когда я это делаю, это выдает некоторую катастрофическую ошибку, в которой говорится, что не удалось найти некоторые включаемые файлы и т.д. В моем проекте довольно много каталогов, и включаемые файлы разбросаны по нескольким местам.. Итак, я не совсем уверен, есть ли какие-либо параметры, которые мне нужно включить для запуска.. Извините, я знаю, что задаю довольно тривиальный вопрос..