我一直在尝试不同的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 ++吗?
P.S。
在PC上,使用libc ++编译的相同程序可以按预期工作。
两个平台上的libc ++版本相同-3.7.0-1ubuntu0.1
答案 0 :(得分:5)
是的,对于PowerPC,ARM甚至在X86 Linux上,我都遇到了完全相同的问题。 问题是(我使用PowerPC进行了跟踪): 抛出是__cxa_throw,它在libc ++的libunwind部分中调用_Unwind_RaiseException。此_Unwind_RaiseException本身正在调用unw_getcontext以获取所有寄存器。现在,它尝试通过ELF文件中的“ .eh_frame”向后查找调用函数。但是由于UnwindLevel1.c是C文件,因此在汇编零件中没有正在创建.eh_frame信息的.cfi_start ...信息。意味着,堆栈跟踪直接在第一个函数(_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
答案 1 :(得分:1)
这是由于libunwind的编译错误。现在已修复:https://reviews.llvm.org/D71117
使用libc ++和libunwind时,ARM异常被打破。 据我所知,它已在LLVM-10.0.0中修复。