我的iPhone应用程序中有一个崩溃,确实引发了NSException.坠机报告完全不清楚错误在哪里,确切原因是什么.有没有一种聪明的方法可以让我在某个地方设置一个顶级异常处理程序,看看是什么导致了它?我自己无法复制这个问题,但我的一些测试版用户肯定可以.
处理这种性质的问题的聪明方法是什么?
我的iPhone应用程序中有一个崩溃,确实引发了NSException.坠机报告完全不清楚错误在哪里,确切原因是什么.有没有一种聪明的方法可以让我在某个地方设置一个顶级异常处理程序,看看是什么导致了它?我自己无法复制这个问题,但我的一些测试版用户肯定可以.
处理这种性质的问题的聪明方法是什么?
看起来您在问两个问题:如何设置顶级异常处理程序;以及如何处理确定根本原因的问题.
捕捉异常可以通过几种不同的方式完成,但对于这一点,最好的方法似乎是使用NSSetUncaughtExceptionHandler设置异常处理程序.
当在应用程序中引发异常时,它将由默认的异常处理程序处理.在应用程序关闭之前,这个处理程序只会在控制台上记录一条消息.您可以通过使用上述函数设置自己的自定义异常处理程序来克服这一问题.最好的方法是在app delegate applicationdFinishLaunching:方法中.
- (void)applicationDidFinishLaunching:(UIApplication *)application
{
NSSetUncaughtExceptionHandler(&myExceptionHandler);
}
一旦设置了自定义处理程序,就需要扩展默认输出,以帮助确定原因.
void myExceptionHandler(NSException *exception)
{
NSArray *stack = [exception callStackReturnAddresses];
NSLog(@"Stack trace: %@", stack);
}
不幸的是,与OSX相比,iPhone在生成良好的堆栈跟踪方面显得非常有限.上面的代码会产生一些看似垃圾的输出;但是,您可以通过atos工具运行此输出,并且应该能够从中生成有用的堆栈跟踪.
另一个 Select 是按照this article上的说明操作,这将有助于自动生成一个漂亮的堆栈跟踪.
由于这将要交给beta测试人员,您可能需要修改一下才能让它为您工作.
你说你自己无法复制这个问题,只有你的用户.在这种情况下,您可能会发现苹果公司的技术说明很有用:
https://developer.apple.com/library/content/technotes/tn2151/_index.html
UPDATE:虽然这篇文章仍然包含有用的信息,但它包含的一些链接是不可逆转的.建议使用this个备选帖子中的信息.