我的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个备选帖子中的信息.

Objective-c相关问答推荐

如何在 Objective-C 中编写计时器?

来自 NSDate 的日期名称?

在从 UIViewController 调用的非保留完成中引用 self 时,weakSelf/strongSelf 舞蹈真的有必要吗?

如何复制 .xib 文件?

Objective-C 和 Cocoa 有什么区别?

将 NSNumber 转换为 NSDecimalNumber

为什么我的 UIButton 的内部修饰事件没有被调用?

从 Unix 时间戳创建 NSDate

我怎样才能拥有一个同时包含图像和文本的 UIBarButtonItem?

如何使用整数值作为键在 NSMutableDictionary 中设置值?

如何以编程方式暂停 NSTimer?

适用于 ios 的 360° 全景库

Interface Builder 中的 IBOutletCollection 集排序

iOS NSLayoutConstraint 使用 constraintWithItem 固定宽度

iOS:使用设备修饰符加载 xib 文件?

如何在 iPhone SDK 中使用自定义字体?

Objective-C 中的 super 到底是什么?

'supportedInterfaceOrientations' 实现中的返回类型冲突: - 警告

关闭一次后如何返回允许推送通知对话框?

公开只读但具有私有设置器的 Objective-C 属性