Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 计算可执行文件中函数调用的数量_C_Ubuntu_Function Call - Fatal编程技术网

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

C 计算可执行文件中函数调用的数量,c,ubuntu,function-call,C,Ubuntu,Function Call,我试图在代码中找到一个实现的C函数的函数调用的确切数目。该项目包括几个C文件。要计算在程序执行期间函数被调用的次数,最简单的解决方案是什么?具体来说,我想知道一个特定函数调用另一个函数的次数。例如,我有一个C文件,如: //file1.c int main(){ foo1(); return 0; } 和其他C文件,如: //file2.c void foo1(){ foo2(); ... foo2(); } 及 现在我有了最后一个可执行文件a.out,我想知道fo

我试图在代码中找到一个实现的C函数的函数调用的确切数目。该项目包括几个C文件。要计算在程序执行期间函数被调用的次数,最简单的解决方案是什么?具体来说,我想知道一个特定函数调用另一个函数的次数。例如,我有一个C文件,如:

//file1.c
int main(){
foo1();
return 0;
}
和其他C文件,如:

//file2.c
void  foo1(){
    foo2();
    ...
    foo2();
}

现在我有了最后一个可执行文件
a.out
,我想知道
foo3()
foo1()
中被调用了多少次。
顺便说一句,我正在Linux上编译和运行我的项目。

您可以使用2个全局变量(放在您声明的文件之外访问变量的位置):

然后,每次调用
foo1
时,您都会增加它的变量,并在返回之前减少它:

void foo1() {
    foo1_active++;
    ...
    foo1_active--;
    return
}
调用
foo3
时,检查
foo1
是否激活,如果激活,则增加计数器:

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

您有一个ubuntu标志,所以我假设您使用的是gcc。我强烈考虑将PG添加到您的cFLAGS并尝试。 分析的工作原理是改变程序中每个函数的运行方式 编译,以便在调用它时,它会隐藏一些 有关从何处调用的信息。从这里,剖析器 可以计算出函数调用它的次数 它被称为。此更改由编译器在程序运行时进行 使用“-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;
}
int公司(){
静态整数计数器=1;
计数器++;
返回计数器;
}
int main(){
int i;
对于(i=0;i<10;i++)
printf(“%d\n”,inc());
返回0;
}

foo3
从其他函数调用?如果您想从foo3中了解这一点,可以在foo3中声明一个静态变量,foo3将在每次调用时递增(函数中声明的静态变量将自动初始化为零,并在一次调用到下一次调用时保留其值)。否则,如果您需要从程序中的任何地方了解这一点,请声明一个全局变量,foo3将在每次调用时递增。您需要对此进行编码还是可以使用外部工具进行编码?我在main.c文件中将
foo3\u计数器定义为
static int
,在我的文件3.c中也使用
extern int foo3\u counter
,但我在文件3.c中不断得到
对'foo3\u counter'的未定义引用。@A23149577删除
静态
void foo3() {
    if foo1_active > 0 { 
        foo3_counter++;
    }
    ...
}
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;
}