6

我想访问存储在没有调试符号的程序的核心转储中的帧(我想在 C 中执行此操作)。当我在 GDB 中打开程序和核心转储时,我会得到一个堆栈跟踪,包括函数的名称。例如:

(gdb) bt
#0  0x08048443 in layer3 ()
#1  0x08048489 in layer2 ()
#2  0x080484c9 in layer1 ()
#3  0x0804854e in main ()

所有函数的名称都存储在 .strtab 部分的可执行文件中。如何使用不同的帧建立堆栈跟踪?不能以批处理模式运行 GDB 。而且仅仅“从 gdb 复制需要的部分”也是一个坏主意,因为代码不是独立编写的。

所以为了更准确地提出我的问题:我在哪里可以找到核心转储中可以开始读取堆栈信息的点?是否有某种图书馆可以访问这些信息?我可以使用的结构?或者更好的是,文档是如何在核心转储中构建这些信息的?

(我已经看到了问题“如何从 C 中的核心转储文件生成堆栈跟踪,而不调用 gdb 等外部工具”,但由于没有有效的答案,我想我会再问一次)

[编辑]我在 Linux x86 下做这个

4

1 回答 1

6

Coredump 也包含堆栈信息。如果您可以将此堆栈信息与 coredump 文件中的 EBP 和 EIP 寄存器值一起使用,则可以打印堆栈跟踪。我写了一个程序来做到这一点。您可以在以下链接中找到该程序。

    http://www.emntech.com/programs/corestrace.c

用法:编译上述程序,执行时给出corefile。

       $corestrace core

如果您还想打印符号,您可以这样做:假设生成核心的程序是“测试”。

       $ nm -n test > symbols
       $ corestrace core symbols

示例输出如下所示:

       $ ./coretrace core symbols 

        0x80483cd foo+0x9
        0x8048401 func+0x1f
        0x8048430 main+0x2d
于 2012-05-15T12:55:51.703 回答