修改“__cxa_allocate_exception”不使用malloc

xMu*_*elx 4 c++ malloc gcc exception-handling exception

我在一个安全的嵌入式系统中工作,我想稍微修改一下异常处理。__cxa_allocate_exception使用malloc()为异常对象分配内存。malloc/new在安全应用程序中是不允许的,所以我必须重写它。

现在我的问题是:在这种情况下有没有办法避免 malloc?

一些替代方案是:

  • 使用静态缓冲区,这会导致多任务/多核应用程序出现问题,所以我不能这样做。
  • 在堆上写入也会引起一些麻烦,因为堆可能已满(内存不足抛出不起作用)。
  • 最后,也许我可以分配(例如)16kb 的任务堆栈空间,并且每个异常对象的大小都是 1kb。这样,我最多可以处理 16 个异常。可悲的是,我对堆栈的理解很低,如果它有任何意义或什至可能的话,就对其进行评级。

Bre*_*ale 5

看看:(gcc-6.3.0/libstdc++-v3/libsupc++/eh_alloc.cc或更高版本)。一个pool(内存)类emergency_pool在匿名命名空间中被指定和实例化。你可以调整EMERGENCY宏值,或完全替换实现 - 只要您在使用池时考虑线程安全。

如果您事先了解调用堆栈深度,则可以为池缓冲区修复始终足够的值。同样,为了线程安全,您可能需要同步原语。

如果这还不够,则在分配失败时__cxa_allocate_exception调用std::terminate。在这里std::set_terminate可以为您提供挽救关键信息的最后机会。


为了线程安全,使用与__gnu_cxx::__mutex池相同的对象以及__gnu_cxx::__scoped_lock习惯用法。这样你就不会依赖任何libsupc++不依赖的东西,比如标准库原子或std::mutex,或者std::lock_guard- 即,创建对libstdc++.


And*_*nak 5

我们发布了一个开源库,它实现了用于异常处理的内存池: https: //github.com/ApexAI/static_exception