首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与libc++异常重合

与libc++异常重合
EN

Stack Overflow用户
提问于 2018-08-03 21:05:13
回答 2查看 1.5K关注 0票数 7

我一直在试验不同的c++库,发现了以下内容:简单的应用程序:

代码语言:javascript
复制
#include <iostream>

int main(int argc, char* argv[])
{
    try
    {
        throw 1;
    }
    catch(...)
    {
        std::cout << "Exception is caught\n";
    }
}

当我像这样在ARM上编译它时:

代码语言:javascript
复制
clang++ -stdlib=stdlibc++

正如预期的那样,异常被捕获。

但当我将其更改为:

代码语言:javascript
复制
clang++ -stdlib=libc++

我不断地得到:

代码语言:javascript
复制
terminating with uncaught exception of type int
Aborted

我试着用各种标志显式地打开异常,比如:

代码语言:javascript
复制
-fexceptions
-fcxx-exceptions
-frtti

但这些标志都不起作用。未捕获异常的原因是什么?会不会是因为libc++安装不正确?

附注:在PC上,用libc++编译的相同程序可以正常工作。两个平台上的libc++版本相同- 3.7.0-1ubuntu0.1

EN

回答 2

Stack Overflow用户

发布于 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

票数 6
EN

Stack Overflow用户

发布于 2020-08-27 20:48:04

这是因为libunwind编译过程中的一个bug。现在已经修复了:https://reviews.llvm.org/D71117

当使用libc++和libunwind时,ARM的异常被打破。据我所知,该问题已在LLVM-10.0.0中修复。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51673343

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档