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

时间:2016-07-19 20:22:10

标签: c ubuntu function-call

我试图在我的代码中找到我实现的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 个答案:

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