您似乎在这里问了两个问题:如何设置顶级异常处理程序;以及如何处理确定根本原因的问题。
可以通过几种不同的方式捕获异常,但最好的方法似乎是使用 NSSetUncaughtExceptionHandler 设置异常处理程序。
当您的应用程序中引发异常时,它由默认异常处理程序处理。这个处理程序只是在应用程序关闭之前将消息记录到控制台。您可以通过使用上述函数设置您自己的自定义异常处理程序来覆盖它。执行此操作的最佳位置是在应用程序委托 applicationDidFinishLaunching: 方法中。
- (void)applicationDidFinishLaunching:(UIApplication *)application
{
NSSetUncaughtExceptionHandler(&myExceptionHandler);
}
设置自定义处理程序后,您需要扩展默认输出以帮助您确定原因。
void myExceptionHandler(NSException *exception)
{
NSArray *stack = [exception callStackReturnAddresses];
NSLog(@"Stack trace: %@", stack);
}
不幸的是,与 OSX 相比,iPhone 在生成良好的堆栈跟踪方面似乎非常有限。上面的代码会产生一些看似垃圾的输出;但是,您可以通过 atos 工具运行此输出,并且应该能够从中生成有用的堆栈跟踪。
另一种选择是遵循this article 上的说明,这将有助于自动生成良好的堆栈跟踪。
由于这是面向 Beta 版测试人员的,您可能需要修补一下才能让它为您工作。
您说您自己无法复制问题,只能复制您的用户。在这种情况下,您可能会发现 Apple 提供的这份技术说明很有用:
https://developer.apple.com/library/content/technotes/tn2151/_index.html
更新:虽然这篇文章仍然包含有用的信息,但其中包含的一些链接已不可逆转地失效。建议使用this替代帖子中的信息。