计算可执行文件中的函数调用次数

Counting the number of function calls in an executable

我试图在我的代码中找到对我实现的 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,想知道在 foo1() 中调用了多少次 foo3()。 顺便说一句,我正在编译 运行 我在 Linux.

上的项目

您可以使用 2 个全局变量(将 extern 放在您声明它们的文件之外访问变量的地方):

int foo1_active = 0;
int foo3_counter = 0;

然后每次调用 foo1 时你递增它的变量并在 return 之前递减它:

void foo1() {
    foo1_active++;
    ...
    foo1_active--;
    return
}

当调用 foo3 时,检查 foo1 是否激活,如果激活,则增加计数器:

void foo3() {
    if foo1_active > 0 { 
        foo3_counter++;
    }
    ...
}

你有一个 ubuntu 标志,所以我假设你正在使用 gcc。我会强烈考虑将 -pg 添加到您的 CFLAGS 并尝试 gprof

Profiling works by changing how every function in your program is compiled so that when it is called, it will stash away some information about where it was called from. From this, the profiler can figure out what function called it, and can count how many times it was called. This change is made by the compiler when your program is compiled with the `-pg' option, which causes every function to call mcount (or _mcount, or __mcount, depending on the OS and compiler) as one of its first operations.

您可以使用静态变量而不是全局变量来计算函数调用次数。

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;
}