Crashlytics无法显示崩溃日志。

24
我刚刚使用这个官方指南安装了Crashlitycs。 我已经为Debug和Release设置了“DWARF with dSYM File”调试信息格式,并禁用了Bitcode(一些人写道这可能有帮助): enter image description here AppDelegate:
Fabric.sharedSDK().debug = true
Fabric.with([Crashlytics.self])
为了模拟崩溃,我使用:

To simulate a crash I use

Crashlytics.sharedInstance().crash()

var ggg: Int!
print(ggg)

Crashlytics会收集一些关于会话的信息。例如,它会更新捆绑版本信息:

enter image description here

所以与Crashlitics的连接是正常的。但是崩溃信息为空:

enter image description here

我正在使用XCode 8和iOS 9/10。我做错了什么?

编辑:

我已经在模拟器和设备上进行了测试,没有使用XCode调试器连接(即从模拟器/设备屏幕启动)

最终,在崩溃后的7-8小时内,我收到了一些Crashlytics报告。我希望它们早些出现,因为根据文档

几分钟内,您应该会在Fabric仪表板上看到崩溃。

然而,我没有收到我等待的所有崩溃报告。在我的实验中,我尝试了不同的初始化Crashlytics的方法:

Fabric.with([Crashlytics.self])
and
Fabric.with([Crashlytics.self()])

可能这就是原因?我也找到了一个类似但没有得到回答的问题


1
Fabric 的 Mike 在这里。你是否连接了 Xcode 的调试器进行测试? - Mike Bonnell
@MikeBonnell 我是在没有连接 XCode 调试器的情况下进行测试的。我也更新了问题。你能帮忙检查一下吗? - Avt
1
如果您在Xcode中点击运行,那么调试器将自动连接。您需要明确地在Xcode中点击停止,然后从模拟器中启动应用程序而不是点击运行。 - Mike Bonnell
@MikeBonnell 当然可以。这是我的做法 - “从模拟器/设备屏幕启动”。 - Avt
根据当前的信息,SO可能不再是讨论这个问题的最佳场所,因为它正在变成一次对话。您可以在TwitterCommunity.com/c/fabric上发布或通过电子邮件发送至support(at)fabric(dot)io吗? - Mike Bonnell
5个回答

31

请核对以下要点:

  1. 确保Crashlytics SDK代码行位于其他所有第三方SDK代码行之后。(它需要是在您的appDidFinishLaunching方法中调用的最后一个。)

  2. 强制崩溃并重新启动应用程序。Xcode必须断开连接才能停止拦截崩溃报告。要断开Xcode,请按照此处的说明进行操作。

  3. 如果您正在使用[Crashlytics sharedInstance] crash];来测试崩溃,请确保它不在appDidFinishLaunching方法中。

这些已经在支持部分提到,以下是额外的要点 -

  1. 在组织->您的应用程序->缺失的dSYM中检查,是否显示任何缺失的dSYM文件

enter image description here

如果是,则执行以下步骤

  1. 右键单击您的存档->显示在Finder中->右键单击文件并单击“显示包内容”
  2. 右键单击dSYM文件->显示包内容->Contents->Resources->DWARF(在终端中打开)
  3. 运行命令dwarfdump --uuid“您在dwarf文件夹中看到的文件名”

enter image description here

这将显示所有关联的UUID,并且如果任何列出的UUID与缺失的dSYM ID中提到的UUID匹配,则只需压缩dSYM文件夹并将其上传到Crashlytics的缺失dSYM部分。

这一步非常重要,因为有时从“组织者”中提取的dSYM文件可能不含正确的UUID。如果上传了错误的文件,则需要等待更新。所以最好确保上传正确的dSYM文件。

除了上述内容之外,构建设置中的位码(Bitcode)属性和调试信息格式(Debug Information Format)也会影响崩溃报告。


完美的答案! - Manoj Srivastava
1
即使是非致命错误,也需要断开Xcode调试器。 - d512

11

您需要运行应用程序,但不是从Xcode运行。

如果您正在使用设备,请在未连接 USB 的情况下启动应用程序。 如果您正在使用模拟器,请停止 Xcode 中的应用程序运行。然后通过鼠标点击重新打开它。

接下来,导航到将调用 Crashlytics.sharedInstance().crash()buttonPressfunction

然后,在崩溃后再次重新打开应用程序。(如果需要,可以连接到控制台)此步骤很重要,因为 Crashlytics 在应用程序终止之前保存了崩溃报告。下次打开应用程序时,它将把报告上传到 Crashlytics。

这里的文档实际上也解释了故障排除问题。


我已经用这种方式做了。我在“编辑”部分写了关于它的内容。然而,当我在设备上测试时(但是从设备启动应用程序,而不是从XCode),我没有拔掉USB。你认为这可能很重要吗? - Avt

5

请在您的构建设置中仔细检查调试信息格式,确保Debug和Release都选择了“带有dSYM文件的DWARF”


1
欢迎来到SO。在第二句话中,OP说:“我已经为Debug和Release都设置了调试信息格式为“DWARF with dSYM文件”...”? 请参阅https://stackoverflow.com/help/how-to-answer。 - Nick
这是我的问题的答案。我之前没有意识到这一点。非常感谢,你救了我的一天。 - Adem

1

2019年仍然相关。

就像Zac Kwan所说,你必须在没有将应用程序实例附加到Xcode的情况下完成此操作。

如果你正在遵循这些文档,它们会让你理解为添加所需信息,然后测试,按崩溃按钮,然后通过Xcode重新启动。

请按照以下步骤操作:

  1. 将所需的Crashlytics信息添加到项目中。在Xcode中运行一次。然后手动转到模拟器,打开应用程序,强制崩溃。
  2. 你应该会收到一封关于“致命错误”的电子邮件。
  3. 大约5-10分钟后,它将显示在Firebase控制台中。

1

导致崩溃无法上传的另一个潜在原因是实现Crashlytics委托而未调用完成处理程序:

// MARK: CrashlyitcsDelegate
func crashlyticsDidDetectReport(forLastExecution report: CLSReport, completionHandler: @escaping (Bool) -> Void) {
    // Last launch we crashed!
    }
}

相反,它应该像这样:

而不是这样:

// MARK: CrashlyitcsDelegate
func crashlyticsDidDetectReport(forLastExecution report: CLSReport, completionHandler: @escaping (Bool) -> Void) {
    // Last launch we crashed!
         completionHandler(true)
    }
}

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