ARM9异常导致系统崩溃并生成核心转储

时间:2014-04-24 22:08:06

标签: linux exception arm toolchain

我正在使用ARM工具链来交叉编译我的驱动程序和应用程序代码。 Gcc-4.2.1,uClibc-0.29.x,binutils-2.19等。

我的应用程序因生成核心转储(分段错误)而崩溃。当我分析核心转储时,我发现在_Unwind_VRS_Pop()调用中发生了崩溃。在将返回地址写入本地指针时崩溃。

实际上,如果有异常,将调用_Unwind_VRS_Pop()。基于在线提供的ARM文档,我看到异常来源是Prefetched Abort。

根据我的理解,当发生异常时,CPU应存储当前寄存器状态并返回地址并退出(当没有MMU时)。但就我而言,应用程序崩溃了。在分析核心时,它显示回溯,_Unwind_VRS_Pop()为第0帧(在此函数中崩溃)。这是应用程序或工具链的错误吗?

重点提及:

  1. 在我的应用程序中,我使用固定内存池进行所有操作。如果我增加这个内存池(堆区域),我不会看到这个问题。
  2. 甚至尝试将我的工具链gcc版本升级到4.2.4。我仍然看到了这个问题。

1 个答案:

答案 0 :(得分:0)

_Unwind_VRS_Pop是C ++异常处理实现的一部分。 C ++异常与Prefetch和Data Abort等硬件异常完全不同。

在这种情况下,你似乎得到了其中一个:首先抛出一个C ++异常(也许是bad_alloc?)然后很好地终止异常处理代码崩溃了硬件异常,操作系统变为seg故障信号并转储核心。通常,核心转储将在处理器进入异常模式之前发生硬件异常时显示进程 - 可能是PC指向或刚刚超过违规指令。

这可能是一个工具链错误,或者您的应用程序可能会意外覆盖异常处理实现使用的数据。

您可以尝试一个抛出并捕获C ++异常的小程序,看看它是否在一个小例子中工作。如果有效,请尝试抛出一个你没有捕获的异常,看看行为是否仍然合理。