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的主要内容,如果未能解决你的问题,请参考以下文章
在抛出 'std::length_error' 的实例后调用终止