为基于 ARM 的嵌入式系统创建 coredump
Posted
技术标签:
【中文标题】为基于 ARM 的嵌入式系统创建 coredump【英文标题】:Creating coredump for ARM based embedded system 【发布时间】:2014-10-29 22:00:57 【问题描述】:我基本上是在跟进core dump note section。我没有发布那个问题,但我正在尝试做同样的事情:编写一个程序来从头开始创建核心转储文件;除了我正在尝试为在嵌入式 ARM 处理器上运行的自定义单线程固件执行此操作。
我还参考了 Google coredumper 来源以了解通常如何创建核心文件。到目前为止,我已经成功创建了一个带有 PT_NOTE 和 PT_LOAD 程序头的核心文件,GDB 可以读取它。
请注意,我正在尝试为自定义固件创建此核心文件,这不是 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】:我想通了。显然,PT_LOAD 程序头的内容——堆栈映射——并不完整。问题是它需要对正在运行的一个线程进行完整映射。在我包含整个 CPU SRAM 的内容后,GDB "bt" 和所有其他命令都可以正常工作。
此外,据我了解,可执行文件具有所有变量的地址,核心文件具有这些变量的运行时值。因此,如果任何符号驻留在内存 (RAM) 中,则应添加具有 RAM 映射的单独 PT_LOAD 程序头。之后,GDB 应该能够准确地打印这些变量的运行时值。如果没有映射,变量的值将是 0(如 GDB 所示)。
【讨论】:
以上是关于为基于 ARM 的嵌入式系统创建 coredump的主要内容,如果未能解决你的问题,请参考以下文章