我正在尝试在用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
已启用。
我知道我过去曾使用过一个类似于此的探查器,但我不记得是哪一个。我做了一些谷歌搜索,我找不到一个好的解决方案,不需要我更改源文件或生成文件。
我可以使用哪种分析工具来完成此任务?还是一个不存在?
感谢。
答案 0 :(得分: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)
答案 1 :(得分:0)
你想要的是“追踪”,其中“每个”功能的进入和退出都记录在一个文件中。这是在一些解释语言中提供的,但在我所知道的编译中没有。我不知道有任何分析者这样做。
我引用了“every”,因为我猜你不想要大量的函数调用,比如I / O,内存分配和释放等等。 实际上,几乎每一台机器指令实际上都是对CPU芯片的微代码或内部功能的函数调用。我想你不关心那些:)
对于除了最小的程序之外的任何程序,这样的痕迹对于任何人来说都太长了。 如果你真正想要的是了解该计划对时间的影响,那么这个主题已经进行了很多讨论,this is my contribution。