Crashlytics iOS - 记录捕获的异常

Posted

技术标签:

【中文标题】Crashlytics iOS - 记录捕获的异常【英文标题】:Crashlytics iOS - log caught exception 【发布时间】:2014-05-31 20:59:52 【问题描述】:

我找到了一种在 Crashlytics android SDK 中记录自定义捕获的异常的方法,但我在 ios SDK 中找不到类似的东西。有没有办法在 iOS 上使用 Crashlytics 记录捕获的异常?

查看Android说明:http://support.crashlytics.com/knowledgebase/articles/202805-logging-caught-exceptions

【问题讨论】:

这很有用。我现在看到的唯一选择(获取崩溃报告/堆栈跟踪)是实际导致应用程序崩溃 - 使用 [[Crashlytics sharedInstance] crash];这显然不是理想的用户体验。在代码中检测到的大多数应用程序错误都可以比应用程序崩溃更优雅地恢复,但此时有面包屑和堆栈跟踪仍然非常有用。 在实现此功能时,您可以通过CLS_LOG(请参阅docs)记录某些消息,它们将被添加到下一次崩溃中。 不知道已经实现了吗? 利用 recordError 我为我知道不会致命的 try/catch 块编写了自己的全局 recordException 【参考方案1】:

来自 Crashlytics 和 Fabric 的 Mike。

您现在可以在您的 iOS、tvOS 或 OS X 应用程序中捕获记录的 NSError。你想使用:

[CrashlyticsKit recordError:error];

Crashlytics.sharedInstance().recordError(error)

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

见Documentation

【讨论】:

如果我想记录捕获的 NSException 而不是 NSError 怎么办? @davis 我们不提供直接记录或记录 NSException 实例的工具。一般来说,Cocoa 和 Cocoa Touch API 不是异常安全的。这意味着使用“@catch”可能会在您的过程中产生非常严重的意外副作用,即使在极其小心使用时也是如此。我们建议您永远不要在代码中使用“@catch”语句。来自 Apple 文档:“Cocoa 框架通常不是异常安全的。一般模式是异常只为程序员错误保留,捕获此类异常的程序应该很快退出。” 在Fabric网站上a好像只能看到NSLocalizedDescriptionKey下的值,但是其他key下可能还有其他有用的信息。我可以生成自己的错误并将所有内容都放入 NSLocalizedDescription 但它.. 气味 @MikeBonnell 如果用户不再打开应用程序怎么办?所有本地记录的 NSError 永远不会被推送到 crashlytics 服务器?如果是这样,并且那些本地记录的错误对于解决问题很重要,是否应该将 NSErrors 记录为 Answer 事件?请澄清。 没错。如果用户从不重新启动应用程序,则不会发送 NSErrors。对于大多数应用程序,我们发现这不是问题。 Answers 事件将有更大的机会被发送,但包含的信息更少。【参考方案2】:

终于 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 但只有在应用重新启动后才会保存最后一条消息。

到目前为止,这里提到的解决方案都不起作用。无法使用 Crashlytics 在 iOS 中跟踪处理的异常。


您可以使用它来记录任何异常

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

在 Crashlytics 中,您会在崩溃报告中看到它,但类型为 NON-FATALS

如果不是预期的使用异常,则事件的记录方式与 Android 处理异常的方式相同。

这在版本 3.0.7 中可用。

recordCustomExceptionName:reason:frameArray:

此方法可用于在报告中记录单个异常结构。这在您的代码与 Lua、C# 或 javascript 等非本地语言交互时特别有用。此调用可能很昂贵,并且只能在进程终止前不久使用。此 API 不打算用于记录 NSException 对象。 Crashlytics 会自动捕获所有可安全报告的 NSException。

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

【讨论】:

您是否设法使用自定义数组类型?不知道该放什么【参考方案3】:

无法使用 Crashlytics SDK 在 iOS 中记录捕获的异常。 CLS_LOG 可用于记录自定义消息,但这些日志消息将仅与下一个崩溃数据一起进入 Crashlytics。如果没有崩溃,这些日志消息将永远不会出现在 Crashlytics 仪表板中。我得到了 Crashlytics 支持团队的官方确认。在 iOS 中记录捕获的异常已在他们的路线图中。

【讨论】:

【参考方案4】:

我已经浏览了不同的站点,以使 IOS 替代 Crashlytics 支持此功能。

我发现 crittercism 是迄今为止最好的..@Dima 我认为它是 Crashlytics 的替代品..试试吧。

这里有一些链接可用于在您的项目中集成批评...!

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]
    

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

【讨论】:

【参考方案5】:

在 catch 块中使用以下行来处理自定义捕获的异常

NSUncaughtExceptionHandler *handler = NSGetUncaughtExceptionHandler();
handler(exception);

正如 iOS 的解释 http://support.crashlytics.com/knowledgebase/articles/222764-can-i-use-a-custom-exception-handler

【讨论】:

能否请您提供完整的 API 调用代码。请考虑以下情况。 @try // 可能导致异常的代码行 @catch (NSException *exception) NSLog(@"%@", exception.reason); // 向 Crashlytics 报告 @SinuVarghese 用于报告的 try-catch 块可以如下所示 @try // 代码行 @catch (NSException *exception) NSUncaughtExceptionHandler *handler = NSGetUncaughtExceptionHandler();处理程序(异常); 以上代码只是将异常保存在处理程序中。但我想要的是“在 Crashlytics 仪表板中查看捕获的异常”。 @SinuVarghese 不,异常没有保存,它被传递给我们在启动方法中设置为 crashalytics 的默认异常处理程序 我尝试了这种方法,但处理程序始终为零。有人有运气吗?

以上是关于Crashlytics iOS - 记录捕获的异常的主要内容,如果未能解决你的问题,请参考以下文章

当 Crashlytics 捕获异常时应用程序崩溃

Crashlytics.getInstance() 返回 null 以记录自定义异常

Android Fabric - 以自定义间隔发送捕获的异常

iOS异常信号的捕获和简单处理

iOS(Fabric):Crashlytics 在启动时崩溃应用程序

ios的app无法捕捉js异常信息