是否有用于打印 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 程序的函数调用序列的实用程序?的主要内容,如果未能解决你的问题,请参考以下文章