5 RT-Thread Studio C++ 异常处理 (与预期不一致)

发布于 2020-08-26 23:52:40

RT-Thread Studio C++ 异常处理

问题

为什么 C++ 异常处理, 运行与预期的不一致?

preview

源码 main.cpp

#include <rtthread.h>

#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>

#include <iostream>
#include <array>
#include <exception>

using namespace rtthread;

int main(int argc, const char *argv[])
{
    using namespace std;
    array<int, 5> arr{};
    try
    {
        cout << arr.at(5) << endl;
    }
    catch (exception &e)
    {
        cout << e.what() << endl;
    }

    return RT_EOK;
}

预期

array::at: __n (which is 5) >= _Nm (which is 5)

结果

thread:main     abort!

硬件配置

MCUFrequencyROMRAM
STM32F411CEU6100Mhz512KB128KB

软件环境

RT-Thread 版本RT-Thread Studio 版本构建IDOSJava version
4.0.3(latest)1.1.3202007312100Windows 10, v.10.0, x86_64 / win321.8.0_144

做过的尝试

其他 IDE 下的尝试

比 RT-Thread Studio 下好多了,不会因为 throw 异常导致 thread abort
MDK-ARM PlusC CompilerAssemblerLinker/Locator
V5.31.0.0V6.14V6.14V6.14

添加编译参数 -fexceptions

859063aaf1ab80b6293cb21a82806937.png

源码 main.cpp

#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>

#include <exception>
#include <array>

int main(int argc, const char *argv[])
{
    std::array<int, 5> arr{};
    try
    {
        rt_kprintf("%d\n", arr.at(5));
    }
    catch (const std::exception& e)
    {
        rt_kprintf("%s\n", e.what());
    }
    rt_kprintf("Nice!\n");

    return RT_EOK;
}

运行结果

2020-08-28.png

引伸问题

  • 如果是 GNU ARM GCC 设置问题,那么应该如何设置?

查看更多

关注者
0
被浏览
50.1k
4 个回答
aozima
aozima 2020-08-27
拒绝白嫖,拒绝键盘侠!

赞1个,这才是提问的正确姿势。

C++不熟,帮顶一下。

qq_还没想好
qq_还没想好 2020-08-27

GCC 工具链,使用 QEMU 工程模拟测试了一下,是可以打印出来。

  1. rtconfig.py 增加编译参数 -fexceptions
  2. 使用楼主测试代码
  3. 编译运行

运行结果如下:

image.png

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友