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

Embedded 为基于ARM的嵌入式系统创建coredump,embedded,arm,elf,coredump,Embedded,Arm,Elf,Coredump,我基本上在跟进。我没有发布这个问题,但我正在尝试做同样的事情:编写一个程序从头开始创建核心转储文件;除了我试图为一个在嵌入式ARM处理器上运行的定制单线程固件做这件事 我还参考了Google source来了解corefiles通常是如何创建的。到目前为止,我已经成功地创建了一个包含PT_注释和PT_加载程序头的核心文件,该文件由GDB读取 请注意,我正在尝试为自定义固件创建此核心文件,而这不是Linux环境。我的问题是关于PT_加载程序头。据我所知,我只需要创建与活动线程(需要为其创建内核)一

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

我还参考了Google source来了解corefiles通常是如何创建的。到目前为止,我已经成功地创建了一个包含PT_注释和PT_加载程序头的核心文件,该文件由GDB读取

请注意,我正在尝试为自定义固件创建此核心文件,而这不是Linux环境。我的问题是关于PT_加载程序头。据我所知,我只需要创建与活动线程(需要为其创建内核)一样多的PT_LOAD程序头,头表示每个线程的内存映射。因为我的固件是单线程的,所以我只创建了一个PT_LOAD程序头,内存映射是堆栈上的地址值

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

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

谁能告诉我我在这里错过了什么


谢谢

我知道了。显然,PT_加载程序头堆栈映射的内容并不完整。问题是它需要运行的一个线程的完整映射。在我包含了整个CPU SRAM的内容之后,GDB“bt”和所有其他命令都工作得很好

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