带有libc ++异常的Clang

时间:2018-08-03 13:05:13

标签: c++ exception arm clang++ libc++

我一直在尝试不同的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

2 个答案:

答案 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中修复。