如何从核心转储中读取帧(没有GDB)?

时间:2012-05-14 14:18:45

标签: gdb stack frames coredump

我想访问存储在没有调试符号的程序的核心转储中的帧(我想在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下这样做

1 个答案:

答案 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