unr*_*nal 6 c++ arm exception clang++ libc++
我一直在尝试不同的c ++库,并发现以下内容:简单的应用程序:
#include <iostream>
int main(int argc, char* argv[])
{
try
{
throw 1;
}
catch(...)
{
std::cout << "Exception is caught\n";
}
}
Run Code Online (Sandbox Code Playgroud)
当我在ARM上编译它时:
clang++ -stdlib=stdlibc++
Run Code Online (Sandbox Code Playgroud)
异常按预期捕获.
但当我把它改为:
clang++ -stdlib=libc++
Run Code Online (Sandbox Code Playgroud)
我经常得到:
terminating with uncaught exception of type int
Aborted
Run Code Online (Sandbox Code Playgroud)
我试图用各种标志明确打开异常,如:
-fexceptions
-fcxx-exceptions
-frtti
Run Code Online (Sandbox Code Playgroud)
但这些标志都不起作用.未被捕获的例外是什么原因?可能是因为错误安装的libc ++?
PS在PC上,使用libc ++编译的相同程序按预期工作.libc ++版本在两个平台上都是相同的 - 3.7.0-1ubuntu0.1
小智 6
是的,我对PowerPC,ARM甚至X86 Linux本身都有同样的问题.问题是(我用PowerPC跟踪它):throw正在执行__cxa_throw,它在libc ++的libunwind部分调用_Unwind_RaiseException.这个_Unwind_RaiseException本身调用unw_getcontext来获取所有寄存器.现在它尝试通过ELF文件中的".eh_frame"向后查找调用函数.但由于UnwindLevel1.c是一个C文件,因此装配部件中没有.cfi_start ...信息正在创建.eh_frame信息.意味着,堆栈跟踪直接在第一个函数(_Unwind_RaiseException)上结束,而不是进一步返回以识别调用"catch"部分.这可以通过使用C++编译器(clang ++而不是clang)编译libc ++中的.c部分来纠正.对于这种情况,还为函数生成.cfi_start信息.现在,Stack-Trace-Back可以找到第一个函数以及以前的函数(在我的测试用例中).对于ARM,我正在寻找下一个问题,因为Stack-Trace-Back不起作用.它反复扫描相同的功能,但不会后退(无限循环).
使用clang ++编译.c文件时,您将遇到stdlib.h中未定义部分的问题,因为它使用了来自libcxx/include的错误的stdlib.h而不是来自MUSL包含的.我现在没有一个好的解决方案,除了手动修改一些头文件.
箕
归档时间: |
|
查看次数: |
733 次 |
最近记录: |