3

我知道在 Android 中,有一个非常可靠的内置系统可以通知我发生的崩溃。他们几乎立即将堆栈跟踪和其他一些信息写入 Google 文档。它工作得非常好。

我开始为 ios 研究同样的东西,但我没有发现任何类似的东西同样有效。我读过这篇文章:Xcode 故事板:为什么 iPad 故事板显示 iPhone 大小的视图?

但我不确定是否仍然如此。谁能推荐我在用户设备上发生的崩溃报告中使用什么?

谢谢!

4

3 回答 3

3

您可以做的是创建一个新的未捕获异常处理程序,然后通过NSSetUncaughtExceptionHandler注册它。这样,每次崩溃都可以在杀死之前被拦截,您可以将其记录/保存到某个地方以上传。

(我个人使用了这个链接中描述的方法:http: //cocoawithlove.com/2010/05/handling-unhandled-exceptions-and.html

于 2012-08-16T15:12:11.007 回答
3

我将Flurry与 uncaughtExceptionHandler 和GTMStackTrace 一起使用

异常处理程序可能如下所示:

void uncaughtExceptionHandler(NSException *exception) 
{
    @try 
    {
        NSString *fullBacktrace = GTMSBStackTraceFromException(exception);
        NSMutableString *backtrace = [NSMutableString stringWithUTF8String:""];
        NSArray *backtraceArray = [fullBacktrace componentsSeparatedByString:@"\n"];
        for (id entry in backtraceArray) 
        {
            NSRange testRange = [entry rangeOfString:[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleName"]];
            if (testRange.length)
            { 
                [backtrace appendString:entry];    
            }
        }

        NSCharacterSet *whitespaces = [NSCharacterSet whitespaceCharacterSet];
        NSPredicate *noEmptyStrings = [NSPredicate predicateWithFormat:@"SELF != ''"];

        NSArray *parts = [backtrace componentsSeparatedByCharactersInSet:whitespaces];
        NSArray *filteredArray = [parts filteredArrayUsingPredicate:noEmptyStrings];
        NSString *strippedBacktrace = [filteredArray componentsJoinedByString:@" "];   
        [FlurryAnalytics logError:@"uncaughtExceptionHandler"
                          message:[NSString stringWithFormat:@"%@", strippedBacktrace ? strippedBacktrace : @"no matching backtrace"]
                        exception:exception];
    }
    @catch (NSException *exception) 
    {
        NSLog(@"whoa!  could not handle uncaught exception!");
        [FlurryAnalytics logError:@"uncaughtExceptionHandler"
                          message:@"no matching backtrace"
                        exception:exception];
    }
}

Testflight也有一个很好的崩溃日志。

于 2012-08-16T15:13:42.717 回答
2

设置未捕获异常处理程序只会为您提供崩溃报告的子集,而且您通过这种方式获得的报告的详细信息非常有限。你没有得到所有线程的堆栈跟踪,你没有得到真正发生崩溃的异常的堆栈跟踪,你没有得到发生崩溃的代码的行号。此外,您不会收到任何由信号处理程序引起的崩溃报告。

此外,一旦发生崩溃,您不应该运行任何 Objective-C 代码,因为它不是异步安全的。有关它的更多信息,请参阅本文:可靠的崩溃报告

如果发布了有关您可以做什么作为以下问题的答案的更多详细信息: iOS和iOS 崩溃日志捕获、调试信息的崩溃分析和报告。捕获并通过电子邮件发送给开发团队

于 2012-08-19T12:09:47.247 回答