Подсчет количества вызовов функций в исполняемом файле
Я пытаюсь найти точное количество вызовов функций для одной из моих реализованных функций C внутри моего кода. Проект включает в себя несколько файлов C. Как проще всего выяснить, сколько раз вызывается функция во время выполнения программы? В частности, мне интересно знать, сколько раз определенная функция вызывает другую функцию. Например, у меня есть файл C, например:
//file1.c
int main(){
foo1();
return 0;
}
и другие файлы C, такие как:
//file2.c
void foo1(){
foo2();
...
foo2();
}
а также
//file3.c
void foo2(){
foo3();
foo3();
foo3();
}
Теперь у меня есть мой окончательный исполняемый файл a.out
и хочу знать, сколько раз foo3()
называется внутри foo1()
, Кстати, я компилирую и запускаю свой проект на Linux.
3 ответа
Вы можете использовать 2 глобальные переменные (поместите extern в те места, которые обращаются к переменной вне объявленного ими файла):
int foo1_active = 0;
int foo3_counter = 0;
тогда каждый раз foo1
Вы называете инкремент переменной, а перед возвратом уменьшаете ее:
void foo1() {
foo1_active++;
...
foo1_active--;
return
}
когда foo3
называется проверить, если foo1
активен, и если это так, вы увеличиваете счетчик:
void foo3() {
if foo1_active > 0 {
foo3_counter++;
}
...
}
У вас есть флаг Ubuntu, поэтому я предполагаю, что вы используете gcc. Я настоятельно рекомендую добавить -pg к вашим CFLAGS и попробовать gprof.
Профилирование работает, изменяя способ компиляции каждой функции в вашей программе таким образом, чтобы при вызове она скрывала некоторую информацию о том, откуда она была вызвана. Исходя из этого, профилировщик может выяснить, какая функция вызывала ее, и подсчитать, сколько раз она была вызвана. Это изменение вносится компилятором, когда ваша программа компилируется с параметром `-pg', который заставляет каждую функцию вызывать mcount (или _mcount, или __mcount, в зависимости от ОС и компилятора) в качестве одной из первых операций.
Вы можете считать вызовы функций, используя статическую переменную вместо глобальной переменной.
int inc(){
static int counter = 1;
counter++;
return counter;
}
int main(){
int i;
for (i = 0; i < 10; i++)
printf("%d\n", inc());
return 0;
}