是否有打印C程序函数调用序列的实用程序?

是否有打印C程序函数调用序列的实用程序?,c,postgresql,profiling,C,Postgresql,Profiling,我试图在用C编写的DBMS上运行一些配置文件,主要是postgres二进制文件。我想能够使用一个实用程序打印出程序所做的函数调用序列。作为一个简单的例子,以该程序为例: void func1 () { printf("x\n"); } void func2 () { printf("y\n"); func1(); } int main () { func2(); func1(); return 0; } 当使用此“实用工具”编译和执行时,我希望看到以下内容: -&

我试图在用C编写的DBMS上运行一些配置文件,主要是postgres二进制文件。我想能够使用一个实用程序打印出程序所做的函数调用序列。作为一个简单的例子,以该程序为例:

void func1 () { 
  printf("x\n");
}

void func2 () {
  printf("y\n");
  func1();
}

int main () {
  func2();
  func1();
  return 0;
}
当使用此“实用工具”编译和执行时,我希望看到以下内容:

-> main
  -> func2
    -> func1
  -> func1
<- 
->main
->功能2
->职能1
->职能1

我知道没有工具可以直接完成这项工作,但是您可以使用它来获取堆栈跟踪以及中断您感兴趣的函数。此时,您应该能够对其进行后处理,以获得所需格式的输出

例如,您可以执行以下操作(为简洁起见进行了编辑):

您需要的是“跟踪”,其中“每个”函数的入口和出口都记录在一个文件中。据我所知,这是以一些解释语言提供的,但不是以编译语言提供的。我不知道有哪一个分析器能做到这一点

我引用“every”是因为有很多层的函数调用我猜你不想要,比如I/O、内存分配和释放等等。 事实上,几乎每一条机器指令实际上都是对微代码或CPU芯片内部功能的函数调用。我想你不想看这些:)

除了最微小的程序外,任何人都无法读取这些痕迹。
如果你真正想要的是了解程序在时间方面做了什么,那么这个主题已经讨论了很多,而且。

我认为没有一个标准命令可以跨所有操作系统执行你想要的操作。你指的是静态配置文件(显示函数调用层次结构)还是动态配置文件(显示基于执行的实际函数调用)?@我指的是动态配置文件。
$ gdb ./program
(gdb) rbreak program.c:.
...
(gdb) commands
>silent
>bt
>cont
>end
(gdb) run
...
#0  main () at program.c:22
...
#0  foo (number=113383) at program.c:4
#1  main () at program.c:22
...
Program exited normally.
(gdb)