为基于ARM的嵌入式系统创建coredump

时间:2014-10-29 22:00:58

标签: embedded arm elf coredump

我基本上跟进core dump note section。我没有发布这个问题但我正在尝试做同样的事情:编写一个程序从头开始创建核心转储文件;除了我试图在嵌入式ARM处理器上运行的自定义单线程固件之外。

我也指谷歌coredumper来源了解核心文件通常是如何创建的。到目前为止,我已成功创建了一个核心文件,其中包含由GDB读取的PT_NOTE和PT_LOAD程序头。

请注意,我正在尝试为自定义固件创建此核心文件,而这不是Linux环境。我的问题是关于PT_LOAD程序头。根据我的理解,我只需要创建尽可能多的PT_LOAD程序头作为活动线程(需要创建核心),其中头部代表每个线程的内存映射。由于我的固件是单线程的,我只创建了一个PT_LOAD程序头,内存映射是堆栈上的地址值。

当我使用这个新创建的核心文件加载固件的ELF图像时,GDB会准确地使用" info reg"打印寄存器。 GDB还识别PC(程序计数器)值并准确显示符号。但是,它无法显示堆栈中的剩余帧数(" bt"无法正常工作)。它抱怨它"无法访问地址(SP + 4)"。

的内存

我已经在核心文件中提供了固件的堆栈映射,GDB应该能够在地址(SP + 4)读取。请注意,我可以使用" x 0x(SP + 4)"来检查(SP + 4)处的值。

谁能告诉我在这里缺少什么?

由于

1 个答案:

答案 0 :(得分:1)

我想出来了。显然,PT_LOAD程序头的内容 - 堆栈映射 - 未完成。问题是它需要整个正在运行的线程的映射。在我包含整个CPU SRAM的内容之后,GDB“bt”和所有其他命令工作正常。

另外,根据我的理解,可执行文件具有所有变量的地址,核心文件具有这些变量的运行时值。因此,如果任何符号是驻留(RAM)驻留,则应添加具有RAM映射的单独PT_LOAD程序头。之后,GDB应该能够准确地打印那些变量的运行时值。如果没有映射,变量的值将为0(如GDB所示)。

相关问题