XCode 6.3 在抛出 Objective-C++ 异常时立即引发 SIGABRT

Posted

技术标签:

【中文标题】XCode 6.3 在抛出 Objective-C++ 异常时立即引发 SIGABRT【英文标题】:XCode 6.3 immediately raises SIGABRT on thrown Objective-C++ exceptions 【发布时间】:2015-04-13 15:50:27 【问题描述】:

考虑以下 Objective-C++ 代码

- (BOOL)application:(UIApplication *)application
        didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

    try
    
        throw std::logic_error("error message");
    
    catch (const std::exception& ex)
    
        NSLog(@"%s", ex.what());
    
    return YES;

在 XCode 6.2 中,它按预期工作(记录了“错误消息”)。然而,自从我们升级到 6.3 后,抛出行 (throw std::logic_error...) 引发了 SIGABRT(堆栈跟踪仅包含 _cxa_throw_pthread_kill,超出了 applicationdidFinishLaunchingWithOptions)并使应用程序崩溃。

这只发生在我们的应用程序中 - 当我将完全相同的代码复制到一个新项目时,一切正常,即使使用相同的编译器标志。

我尝试指定 -fexceptions-fnon-call-exceptions 无济于事(相同的行为)。

更新 似乎这只发生在 32 位模拟器上(它适用于实际设备和 64 位模拟器)。

更新 2 我们将其缩小到UserVoice ios SDK。只需通过链接即可在新的 vanilla 项目中清楚地显示该行为(确保调用某些方法以便发生链接)。我们尚未调查该库中究竟是什么导致了它,而且我们还有一些内部库会引发相同的行为(但它们应该与 Microsoft 以外的任何人无关)。

【问题讨论】:

调试与发布是否相同?你能看一下编译器的输出,看看它是否在 6.2 和 6.3 之间匹配?这可能至少表明它是运行时而不是编译器。 另外添加一个 catch(...) 来查看你是否捕捉到 something @KirkSpaziani 在调试和发布中都是一样的。编译器输出简单地说 libc++abi.dylib: terminating with uncaught exception of type std::logic_error: error message (显然,在正确捕获异常的 6.2 中不存在此行)。添加catch (...) 并没有什么不同。 您是否在使用任何框架/cocoapods?例如崩溃处理程序?只是缺乏关于您的应用与普通旧版应用之间有什么不同的详细信息,而且您并没有真正给出任何提示 尝试使用objective-C++ @catch,根据文档应该更好地工作,因为它可以(至少在最新版本中)捕获C++异常 【参考方案1】:

我发现 6.3 充满了严重的错误。升级到 6.3.2 似乎解决了我所有的问题。试一试。

【讨论】:

我刚刚测试了6.3.2,恐怕问题没有解决。据我从苹果开发者论坛线程 (devforums.apple.com/thread/267548?tstart=0) 中得知,它只会在 6.4 中得到解决。【参考方案2】:

显然这个问题是XCode bug(特别是链接器)。据报道,它已在 XCode 6.4b3 中修复。我用的是 6.4 (6E35b) 确实好像已经解决了。

【讨论】:

以上是关于XCode 6.3 在抛出 Objective-C++ 异常时立即引发 SIGABRT的主要内容,如果未能解决你的问题,请参考以下文章

(c++) 在抛出一个实例后调用终止

在抛出 'std::length_error' 的实例后调用终止

为啥方法在抛出异常后不需要返回值?

导入 tensorflow 错误:在抛出“Xbyak::Error”实例后调用终止

谁在抛出(并捕获)这个 MySQL 异常?

为啥我应该在抛出异常指针时使用按引用捕获