现在还有一个这个行为的最小例子: https://community.nxp.com/message/862676
我使用一个ARM Cortex M4与freertos使用freescales自由Kinetis IDE(gnu手臂工具链).问题是那个
try { throw 4; // old scenario also not working: throw std::runtime_error("wut"); } catch (...) { }
导致停止的cpu和代码在try或(当某些被添加后)在catch处理程序不执行.
并可以在这里找到:https://gist.github.com/Superlokkus/3c4201893b4c51e154e2a0afdf78fef0
我认为这导致一个SVC中断,对不起,我错了,Freertos欺骗我,因为当我抛出一些它停止在DefaultISR.
throw确实跳到__cxa_throw,然后从那里到___Unwind_RaiseException __gnu_Unwind_RaiseException __cxa_begin_catch>
< _ZSt9terminatev>
所以看起来像std :: terminate被调用,但是catch块不应该允许这个.或者我的假设是错误的,这种行为是因为gcc C运行时异常支持是一个总是调用终止的存根?
更新ji9:因为我看到rand()尝试使用malloc(),我还定义了一个工作的malloc()/ freeRTOS函数和etvoilà:__cxa_allocate_exception使用malloc(我不知道工具链如何期望我处理一个bad_alloc的情况).
所以现在,它仍然崩溃,但是除了分配(我认为):
卓越的路径是:
(throwing function after exception allocation) __cxa_throw ... //(some intructions in __cxa_throw) __cxa_begin_catch //I guess something went wrong here _ZSt9terminatev // Immediately after __cxa_begin_catch _ZN10__cxxabiv111__terminateEPFvvE: 00016dfc: push {r3,lr} 00016dfe: blx r0 //Goes directly to WDOG_EWM_IRQHandler or hard fault handler 00016e00: bl 0x194ac <abort>
如果你想知道或可能有帮助:我的调试器说它的WDOG_EWM_IRQHandler我崩溃了,如果我没有定义hard_fault处理程序和一个自己的默认处理程序.
所以我猜这个堆栈解决了一些问题,因为我在_throw的名字中以“完成的堆栈解卷”去了一些符号,但是我没有捕捉到我在一个对象的析构函数中设置的断点,清理干净而这似乎是激励__cxa_begin_catch调用中止或某事.
(Kinetis Design Studio 3.2.0
GNU ARM C/C++交叉编译器
版本:1.12.1.201502281154
为我们
FRDM-KV31F)
解决方法
我猜,因为你没有在你的代码中使用外设,所以这将是一个错误处理程序,可能是硬的错误.同一页面(参见上面的链接)也提供了有关调试的说明.
除此之外 – 确保您执行正常的FreeRTOS调试事情,例如确保已定义了configASSERT(),并且您有堆栈溢出检查.有关这些主题的信息请见此页面:http://www.freertos.org/FAQHelp.html