我试图在我的代码中找到我实现的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上编译和运行我的项目。
答案 0 :(得分: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++;
}
...
}
答案 1 :(得分:1)
你有一个ubuntu标志,所以我假设你正在使用gcc。我强烈考虑在您的CFLAGS中添加-pg并尝试gprof。
通过更改程序中的每个函数的方式来进行性能分析 编译,以便在调用它时,它会隐藏一些 有关其来自何处的信息。由此,剖析器 可以弄清楚它叫什么函数,可以计算多少次 它被称为。这个更改是由程序编译器完成的 使用`-pg'选项编译,这会导致每个函数都调用 mcount(或_mcount,或__mcount,取决于操作系统和编译器)as 它的第一个操作之一。
答案 2 :(得分: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;
}