2016-07-19 4 views
1

Я пытаюсь найти точное число вызовов функций одной из моих реализованных функций 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(). BTW, я компилирую и запускаю свой проект в Linux.

+0

'foo3' вызван из других функций? –

+0

Если вы хотите знать это изнутри foo3, вы можете объявить статическую переменную внутри foo3, что foo3 будет увеличивать каждый вызов (статическая переменная, объявленная внутри функции, автоматически инициализируется до нуля и сохраняет ее значение от одного вызова к следующему) , В противном случае, если вам нужно знать это из любой точки программы, объявите глобальную переменную, которую foo3 будет увеличивать при каждом вызове. –

+1

Вам нужно закодировать это или вы можете использовать для этого внешний инструмент? –

ответ

4

Вы можете использовать 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++; 
    } 
    ... 
} 
+0

Я определил 'foo3_counter' как' static int' в моем файле main.c, а также использовал 'extern int foo3_counter' внутри моего файла3.c, но я продолжаю получать' undefined ссылку на 'foo3_counter'' внутри моего файла3.c , – A23149577

+0

@ A23149577 удалите 'static' –

1

У вас есть флаг ubuntu, поэтому я предполагаю, что вы используете gcc. Я настоятельно рекомендую добавить -pg в ваш CFLAGS и попробовать gprof.

Профилирование работы путем изменения, как каждая функция в программе является составлена ​​таким образом, что, когда его называют, он будет копить некоторые информацию о том, где она была вызвана. Из этого профайлер может определить, какую функцию он назвал, и может подсчитать, сколько раз он вызывал . Это изменение выполняется компилятором, когда ваша программа скомпилирована с опцией -pg, что заставляет каждую функцию вызывать mcount (или _mcount или __mcount, в зависимости от ОС и компилятора) как одна из первых операций ,

0

Вы можете рассчитывать вызовы функций с использованием статической переменной вместо глобальной переменной.

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; 
} 
Смежные вопросы