Подсчет количества вызовов функций в исполняемом файле

Я пытаюсь найти точное количество вызовов функций для одной из моих реализованных функций 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;
}
Другие вопросы по тегам