2

我正在尝试在用 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 的好解决方案。

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

谢谢。

4

2 回答 2

1

我知道没有工具可以直接执行此操作,但是您可以使用GDB 断点命令来获取堆栈跟踪以及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)
于 2013-08-31T03:20:25.737 回答
0

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

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

对于除了最小的程序之外的任何程序,这样的痕迹对于任何人来说都太长了。如果你真正想要的是了解程序在时间方面做了什么,那么这个主题已经被讨论得非常多,这就是我的贡献

于 2013-08-31T14:40:04.970 回答