我正在使用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帧(在此函数中崩溃)。这是应用程序或工具链的错误吗?
重点提及:
答案 0 :(得分:0)
_Unwind_VRS_Pop
是C ++异常处理实现的一部分。 C ++异常与Prefetch和Data Abort等硬件异常完全不同。
在这种情况下,你似乎得到了其中一个:首先抛出一个C ++异常(也许是bad_alloc
?)然后很好地终止异常处理代码崩溃了硬件异常,操作系统变为seg故障信号并转储核心。通常,核心转储将在处理器进入异常模式之前发生硬件异常时显示进程 - 可能是PC指向或刚刚超过违规指令。
这可能是一个工具链错误,或者您的应用程序可能会意外覆盖异常处理实现使用的数据。
您可以尝试一个抛出并捕获C ++异常的小程序,看看它是否在一个小例子中工作。如果有效,请尝试抛出一个你没有捕获的异常,看看行为是否仍然合理。