C 如何跟踪所有本地函数调用和退出,并将其记录到文件中以供查看

C 如何跟踪所有本地函数调用和退出,并将其记录到文件中以供查看,c,linux,debugging,call,trace,C,Linux,Debugging,Call,Trace,我想在Linux下跟踪一个C程序,并以树的形式记录所有函数调用和返回。 例如,源代码: void a () { printf("a\n"); } void b () { printf("b\n"); } void c () { a(); b(); } int main() { a(); b(); c(); } 我想要一个如下的输出: call main call a exit a call b exit

我想在Linux下跟踪一个C程序,并以树的形式记录所有函数调用和返回。 例如,源代码:

void a ()
{
    printf("a\n");
}
void b ()
{
    printf("b\n");
}

void c ()
{
    a();
    b();
}

int main()
{
    a();
    b();
    c();
}
我想要一个如下的输出:

call main
    call a
    exit a
    call b
    exit b
    call c
        call a
        exit a
        call b
        exit b
    exit c
exit main

这是一个理想主义的输出。我只想获得本地函数调用和返回的所有过程,因此也欢迎使用类似的输出。

要通过修改代码来生成这样的输出,请尝试以下操作(未优化,但可以完成此工作):

大小缩进;
#定义输入函数(函数名称)\
缩进++\

对于(size_t i=0;igcc-finstruction函数完成我的工作

很好地使用
printf
跟踪函数的进入和退出(C++的构造函数/析构函数概念)。若要在文件中打印,请使用
fprintf
请检查此链接。这可能会有帮助。这是一个大项目,因此很难手动将fprintf语句注入所有函数。是否有任何工具可以帮助我?您可能会找到有用的ltrace。用于跟踪调用,但我不知道您是否可以跟踪出口。SystemTap有您需要的工具需要。唯一可能导致问题的是,您的项目太大,无法用SystemTap跟踪。我回答了差不多相同的问题后,非常感谢!这是一个大项目,因此很难手动将ENTER_FUNC语句插入所有函数。有没有工具可以帮我将ENTER_FUNC插入所有函数?例如,如果你了解Python,你可以编写一个脚本来完成这项工作。也可以(小心地)在Vim这样的编辑器中使用适当的搜索和替换命令来完成。例如:只要有
return[where]
insert
EXIT_FUNC
。还要注意的是,如果您有一个包含大量调用的大型程序,这些宏将严重影响您的性能。而且它们不受竞争调用(线程等)的保护
size_t indent;

#define ENTER_FUNC(function_name)                     \
    indent++;                                         \
    for(size_t i=0; i<indent; i++) printf("\t");      \
    printf("Call %s\n", function_name);

#define EXIT_FUNC(function_name)                     \
    for(size_t i=0; i<indent; i++) printf("\t");     \
    printf("Exit %s\n", function_name);              \
    indent--;