我一直在试验不同的c++库,发现了以下内容:简单的应用程序:
#include <iostream>
int main(int argc, char* argv[])
{
try
{
throw 1;
}
catch(...)
{
std::cout << "Exception is caught\n";
}
}当我像这样在ARM上编译它时:
clang++ -stdlib=stdlibc++正如预期的那样,异常被捕获。
但当我将其更改为:
clang++ -stdlib=libc++我不断地得到:
terminating with uncaught exception of type int
Aborted我试着用各种标志显式地打开异常,比如:
-fexceptions
-fcxx-exceptions
-frtti但这些标志都不起作用。未捕获异常的原因是什么?会不会是因为libc++安装不正确?
附注:在PC上,用libc++编译的相同程序可以正常工作。两个平台上的libc++版本相同- 3.7.0-1ubuntu0.1
发布于 2018-08-07 19:37:46
是的,我在PowerPC、ARM甚至X86 Linux上都遇到了完全相同的问题。问题是(我用PowerPC跟踪了它):抛出是在做一个__cxa_throw,它在libc++的libunwind部分调用_Unwind_RaiseException。此_Unwind_RaiseException本身正在调用unw_getcontext来获取此时的所有寄存器。现在,它试图通过ELF文件中的".eh_frame“向后查找调用函数。但是由于UnwindLevel1.c Level1.c是一个C文件,所以没有.cfi_start ...创建.eh_frame表信息的装配零件中的信息。意味着堆栈回溯直接结束于第一个函数(_Unwind_RaiseException),而不是返回到标识调用的"catch“部分。这可以通过使用C++编译器(clang++而不是clang)编译libc++中的.c部分来纠正。对于这种情况,还会为函数生成.cfi_start信息。现在Stack-Trace-Back可以找到第一个函数和之前的函数,直到main (在我的测试用例中)。对于ARM,我现在正在寻找下一个问题,因为Stack-Trace-Back不起作用。它一次又一次地扫描相同的函数,但不会倒退(无限循环)。
当用clang++编译.c文件时,你会遇到在stdlib.h中没有定义部分的问题,因为它使用了来自libcxx/include而不是来自MUSL include的错误的stdlib.h。我现在没有一个好的解决方案,除了手动修改一些头文件。
Kei
发布于 2020-08-27 20:48:04
这是因为libunwind编译过程中的一个bug。现在已经修复了:https://reviews.llvm.org/D71117
当使用libc++和libunwind时,ARM的异常被打破。据我所知,该问题已在LLVM-10.0.0中修复。
https://stackoverflow.com/questions/51673343
复制相似问题