为基于 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的主要内容,如果未能解决你的问题,请参考以下文章

如何在基于 ARM 的嵌入式 Linux 系统上进行节电?

交叉编译VIM并移植到ARM嵌入式Linux系统

基于ARM嵌入式 Linux 快速启动

基于arm的多路温度采集控制系统项目介绍

[boostrap]debian下为arm创建debian和emdebian文件系统

嵌入式linux vi 版本,交叉编译Vim并移植到ARM嵌入式Linux系统