Firebase crashlytics 没有告诉我 swift 的确切崩溃问题

Posted

技术标签:

【中文标题】Firebase crashlytics 没有告诉我 swift 的确切崩溃问题【英文标题】:Firebase crashlytics does not telling me the exact crash problem with swift 【发布时间】:2019-12-26 15:42:46 【问题描述】:

我已经在堆栈上阅读了很多关于此的问题,但有没有解决方案来解决此问题以获取崩溃报告的缺失部分?

我知道这些崩溃是由 nil 或未包装的选项或其他原因引起的,但 objc 的崩溃要好得多:

我的项目基于 objetive-c(几年前开始),但新的主要部分是用 swift 编写的。来自 objc 部分的所有崩溃都非常详细,但来自 swift 部分的崩溃则没有。

所以问题是,我将如何获得可读的崩溃报告而不是 EXC_BREAKPOINT 0x00000001028817ac

【问题讨论】:

我理解这个问题,但您正在比较两种完全不同类型的崩溃。在一种情况下,您尝试使用 nil 值,而第二种情况是访问超出范围的特定数组元素。第二种情况更容易管理和报告。在第一个示例中,您在寻找崩溃报告的具体内容是什么?您需要什么“缺失部分”? @Jay 首先,新年快乐!因此,就我个人而言,我对此错误消息只有一件事不明白,为什么它的可读性不高。有没有办法得到一个错误消息,比如:“在展开可选值时发现 nil”而不是 exc_breakpoint。因为 ofc 我发现了这个问题,并且已经修复了它,但是如果有这样的详细消息会更好。还是这种类型的消息总是意味着这个? 这是一个常见错误,通常在强制展开选项时生成。你可能正在做类似forUser: user!的事情。 好的,谢谢。这个错误发生在 obj-c 和 swift 代码的边缘。在这种情况下(objc 端)有一个数组,并且强制转换为!在 for in 中的 swift 侧,但是当数组为空时它崩溃了 【参考方案1】:

对于这种情况,我建议在应用中添加用户行为的高级分析,然后尝试重复与用户相同的步骤。这将有助于找到此类崩溃的根源。我可以分享代码,您可以在此基础上在应用的屏幕上添加必要的功能:

import Foundation
import Crashlytics

class EventLogger 

    /// Log a handled non-fatal exception
    class func logException(_ exception: NSException) 
        print("Catched exception: \(exception.debugDescription)")

        let frames = exception.callStackSymbols.map  symbol in CLSStackFrame(symbol: symbol) 
        Crashlytics.sharedInstance().recordCustomExceptionName(exception.name.rawValue, reason: exception.reason, frameArray: frames)
    

    private class func log(_ string: String) 
        CLSLogv(string, getVaList([]))
    

    class func log(screen: String) 
        log("User is located at \(screen) Screen")
    

    /// Log a status of feature
    class func log(feature: String, status: String) 
        log("Feature \(feature) was \(status)")
    

    /// Log an event
    class func log(event: String) 
        log("Event: \(event)")
    

并像这里一样实施它:

EventLogger.log(event: "Pressed login button")

崩溃后,您可以准确地看到这次崩溃的操作日志

【讨论】:

文档声明“此 API 不适用于记录 NSException 对象”,用于方法 recordCustomExceptionName()

以上是关于Firebase crashlytics 没有告诉我 swift 的确切崩溃问题的主要内容,如果未能解决你的问题,请参考以下文章

Crashlytics-Firebase 崩溃报告没有意义[重复]

Firebase Crashlytics 为 UUID 上传丢失的 dSYMs 文件

Firebase、Fabric 和 Crashlytics,带有 -ObjC 链接器标志,没有 Cocoapods iOS

如何在 iOS 上使用 Firebase 以编程方式获取 Crashlytics 版本

Firebase Crashlytics 在没有 Fabric API 密钥的情况下无法工作

有没有办法让 Firebase Crashlytics 在远程服务中工作?