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

Posted

技术标签:

【中文标题】是否有用于打印 C 程序的函数调用序列的实用程序?【英文标题】:Is there a utility to print function call sequence for C programs? 【发布时间】:2013-08-30 23:49:45 【问题描述】:

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

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


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


int main () 
  func2();
  func1();
  return 0;

当使用这个“实用程序”编译和执行时,我希望看到类似这样的内容:

-> main
  -> func2
    -> func1
  -> func1
<- 

另外,我无法修改源代码或 makefile,但是 -g 已经启用。

我知道我过去曾使用过类似的分析器,但我不记得是哪一个。我进行了一些谷歌搜索,但找不到不需要我更改源代码或 makefile 的好解决方案。

我可以使用什么分析工具来完成这项工作?还是不存在?

谢谢。

【问题讨论】:

我不认为有一个标准命令可以在所有操作系统上运行,可以满足您的需求。 您指的是静态配置文件(显示函数调用层次结构)还是动态配置文件(显示基于执行的实际函数调用)? @mbratch 我指的是动态配置文件。 【参考方案1】:

我知道没有工具可以直接执行此操作,但您可以使用GDB breakpoint commands 来获取堆栈跟踪以及regex break 来中断您感兴趣的功能。此时您应该能够进行后处理它以您想要的格式获得输出。

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

$ 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)

【讨论】:

【参考方案2】:

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

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

对于除了最小的程序之外的任何程序,这样的痕迹对于任何人来说都太长了。 如果您真正想要的是了解程序在 时间 方面所做的事情,那么这个主题已经得到了非常多的讨论,this is my contribution

【讨论】:

以上是关于是否有用于打印 C 程序的函数调用序列的实用程序?的主要内容,如果未能解决你的问题,请参考以下文章

命令行实用程序,用于打印 linux 中的数字统计信息

任何用于打印javax.servlet.http.Cookie的所有字段的实用程序

深度克隆实用程序推荐 [关闭]

深度克隆实用程序推荐 [关闭]

用于检查匿名类型的JSON字符串的C#泛型实用程序

oracle学习之第一个存储过程:打印Hello World