【发布时间】: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++异常
标签: objective-c xcode6