2012-05-14 58 views
7

我想访问保存在没有调试符号的程序的核心转储中的帧(我想在C中执行此操作)。当我打开程序和GDB中的核心转储时,我得到一个包含函数名称的堆栈跟踪。例如:如何从核心转储(无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这样

+3

Windows,Linux或MacOS的? x86,x86_64,PPC,Arm ....? – Flexo

+0

哦,天哪,我很抱歉,忘了! Linux,x86 – Uhlo

+0

http://www.kernel.org/doc/man-pages/online/pages/man5/core.5.html – Flexo

回答

7

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

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

用法:编译上述程序并在执行时给出核心文件。

 $corestrace core 

如果您还想要打印符号,您可以这样做:让我们假设产生核心的程序是'test'。

 $ nm -n test > symbols 
     $ corestrace core symbols 

样本输出看起来是这样的:

 $ ./coretrace core symbols 

     0x80483cd foo+0x9 
     0x8048401 func+0x1f 
     0x8048430 main+0x2d 
+0

这帮了很多,谢谢! – Uhlo

+0

链接不再有效,但我在http://emntech.blogspot.com/2012/08/printing-backtracestack-trace-using.html找到了一份副本 – mephi42

+0

为此添加了一个要点:https://gist.github的.com/root42/c979b037f85dc4b2be1f3735afedeb1d – Arne