Crashlytics iOS - 记录捕获的异常日志

47

这将非常有用。目前我所看到的唯一替代方法(获取崩溃报告/堆栈跟踪)是实际上导致应用程序崩溃-使用[[Crashlytics sharedInstance] crash]; 这显然不是理想的用户体验。代码中检测到的大多数应用程序错误可以比应用程序崩溃更优雅地恢复,但在那时拥有面包屑和堆栈跟踪仍然非常有用。 - Bradley Thomas
在此实现之前,您可以执行 CLS_LOG(请参阅文档)来记录某些消息,它们将被添加到下一个崩溃报告中。 - vrwim
你知道它是否已经被实现了吗? - Shobhit Puri
利用 recordError,我编写了自己的全局 recordException,用于处理我知道不会致命的 try/catch 块。 - Jacksonkr
5个回答

43

我是来自Crashlytics和Fabric的Mike。

现在您可以在iOS、tvOS或OS X应用中捕获已记录的NSErrors。您应该使用:

[CrashlyticsKit recordError:error];
或者
Crashlytics.sharedInstance().recordError(error)

这将让您在每个用户会话中捕获相当数量的已记录 NSErrors。这些仅在应用程序重新启动时发送。记录的错误按错误域和代码分组。这意味着错误问题可能涉及许多不同的调用站点。

请参见文档


1
如果我想记录捕获的NSException而不是NSError怎么办? - davis
3
我们没有提供记录NSException实例的设施。一般来说,Cocoa和Cocoa Touch API不是异常安全的。这意味着即使在极度小心的情况下使用"@catch",它也可能对您的进程产生非常严重的意外副作用。我们建议您永远不要在代码中使用"@catch"语句。根据苹果文档:“Cocoa框架通常不支持异常安全。一般模式是将异常保留给程序员错误,并且捕获此类异常的程序应尽快退出。” - Mike Bonnell
发现了一个和我的问题相关的主题: https://twittercommunity.com/t/crashlytics-non-fatal-issues-extended-information/64756 - Oleksii Nezhyborets
2
@MikeBonnell 如果用户不再打开应用程序怎么办?所有本地记录的 NSErrors 将永远不会被推送到 Crashlytics 服务器吗?如果是这样,并且这些本地记录的错误对于解决问题很重要,那么应该将 NSErrors 记录为 Answer 事件吗?请澄清。 - geekoraul
1
没错。如果用户从未重新启动应用程序,则不会发送NSErrors。对于大多数应用程序,我们发现这不是问题。答案事件有更大的机会被发送,但包含的信息较少。 - Mike Bonnell
显示剩余6条评论

5

终于,Crashlytics在3.5.0版本中添加了所需的功能!!

[CrashlyticsKit recordError:error];

或者

Crashlytics.sharedInstance().recordError(error)

参考资料

/**
 *
 * This allows you to record a non-fatal event, described by an NSError object. These events will be grouped and
 * displayed similarly to crashes. Keep in mind that this method can be expensive. Also, the total number of
 * NSErrors that can be recorded during your app's life-cycle is limited by a fixed-size circular buffer. If the
 * buffer is overrun, the oldest data is dropped. Errors are relayed to Crashlytics on a subsequent launch
 * of your application.
 *
 * You can also use the -recordError:withAdditionalUserInfo: to include additional context not represented
 * by the NSError instance itself.
 *
 **/
- (void)recordError:(NSError *)error;
- (void)recordError:(NSError *)error withAdditionalUserInfo:(nullable CLS_GENERIC_NSDICTIONARY(NSString *, id) *)userInfo;

https://docs.fabric.io/ios/changelog.html#january-7-2016


历史记录

实际上,这并不像我期望的那样工作:消息被保存到Crashlytics中,但只有在应用程序重新启动后才会保存最后一条消息。

到目前为止,这里提到的解决方案都没有奏效。在iOS中使用Crashlytics无法跟踪处理过的异常。


您可以使用此功能来记录任何异常

[[Crashlytics sharedInstance] recordCustomExceptionName:@"HandledException" reason:@"Some reason" frameArray:@[]];

在Crashlytics中,您会在崩溃报告中看到它,但以NON-FATALS类型显示。
即使不是预期的使用方式,异常也以与Android处理异常相同的方式记录。
此功能可在版本3.0.7中使用。

recordCustomExceptionName:reason:frameArray:

此方法可用于记录报告中的单个异常结构。当代码与Lua,C#或Javascript等非本机语言交互时,这特别有用。此调用可能很昂贵,仅应在进程终止前短时间内使用。此API不适用于记录NSException对象。所有安全可报告的NSExceptions都会被Crashlytics自动捕获。

https://docs.fabric.io/appledocs/Crashlytics/Classes/Crashlytics.html#//api/name/recordCustomExceptionName:reason:frameArray:


3
你成功使用了自定义数组类型吗?我不知道在里面放什么。 - thibaut noah

3

使用Crashlytics SDK在iOS中捕获异常无法记录日志。可以使用CLS_LOG记录自定义消息,但这些日志消息只会在下一次崩溃数据上传到Crashlytics时才会被记录。如果没有崩溃,这些日志消息将永远不会出现在Crashlytics仪表板中。我从Crashlytics支持团队得到了官方确认。在iOS中记录捕获的异常是他们未来计划中的一项。


2

我已经查看了不同的网站,寻求IOS系统下Crashlytics的替代选项。

我发现crittercism目前是最好的选择。@Dima 我认为它是Crashlytics的替代方案,请试用一下。

以下链接对于将crittercism集成到您的项目中很有帮助...!

http://docs.crittercism.com/ios/ios.html#logging-handled-exceptions

http://www.raywenderlich.com/34050/overview-of-ios-crash-reporting-tools-part-2

@try {

     } 
@catch (NSException *exc) 
     {
        [Crittercism logHandledException:exc]
    }

请参考这些链接,看看它们对你是否有用...!


1

请提供带有API调用的完整代码。请考虑以下情况。 @ try { // 可能会引起异常的代码行 } @ catch (NSException *exception) { NSLog(@"%@", exception.reason); // 报告给Crashlytics } - Sinu Varghese
@SinuVarghese 报告的 try-catch 块可以像下面这样: @ try { // 代码行 } @ catch (NSException *exception) { NSUncaughtExceptionHandler *handler = NSGetUncaughtExceptionHandler(); handler(exception); } - Aanabidden
以上代码只是将异常保存在处理程序中。但我想要的是“在Crashlytics仪表板中查看捕获的异常”。 - Sinu Varghese
@SinuVarghese 不,异常并没有被保存,而是被传递给了我们在应用启动方法中设置的默认异常处理程序crashalytics。 - Aanabidden
我尝试了这种方法,但处理程序始终为空。有人用它成功了吗? - markdb314
如果@markdb314,那么crashlytics可能没有被初始化。因为在我的代码中,处理程序不显示nil。 - Aanabidden

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接