我想访问存储在没有调试符号的程序的核心转储中的帧(我想在C中执行此操作)。当我在GDB中打开程序和核心转储时,我得到一个包含函数名称的堆栈跟踪。例如:
(gdb) bt
#0 0x08048443 in layer3 ()
#1 0x08048489 in layer2 ()
#2 0x080484c9 in layer1 ()
#3 0x0804854e in main ()
所有函数的名称都存储在.strtab部分的可执行文件中。如何使用不同的框架构建堆栈跟踪?以批处理模式运行GDB是不一个选项。而且只是“从gdb中复制部分需要”也是一个坏主意,因为代码不是独立编写的。
所以更准确地提出我的问题:我在哪里可以找到核心转储中的点,我可以在哪里开始读取堆栈信息?是否有某种图书馆可以访问这些信息?我可以使用的结构?或者更好的是,文档如何在核心转储中构建这些信息?
(我已经看到了问题“how to generate a stack trace from a core dump file in C, without invoking an external tool such as gdb”,但由于没有有效答案,我想我会再问一次)
[编辑] 我在Linux x86下这样做
答案 0 :(得分:6)
Coredump也包含堆栈信息。如果可以将此堆栈信息与coredump文件中的EBP和EIP寄存器值一起使用,则可以打印堆栈跟踪。我写了一个程序来做这件事。您可以在以下链接中找到该程序。
http://www.emntech.com/programs/corestrace.c
用法:编译上面的程序并在执行时给出corefile。
$corestrace core
如果你想要打印符号,你也会这样:让我们假设生成核心的程序是'test'。
$ nm -n test > symbols
$ corestrace core symbols
示例输出如下所示:
$ ./coretrace core symbols
0x80483cd foo+0x9
0x8048401 func+0x1f
0x8048430 main+0x2d