如何得到Crashlytics所做的崩溃和方法,以及开源的PLCrashReporter

正如我所提到的,我正试图恢复崩溃的行,并在其中发生的function。

我需要指出,我已经尝试了AppDelegate中的下一个代码,我得到的堆栈没有符号化,类和错误抛出:

NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler); void uncaughtExceptionHandler(NSException *exception) { NSLog(@"Exception description - %@",[exception description]); NSLog(@"Exception name - %@", [exception name]); NSLog(@"Reason - %@", [exception reason]); NSLog(@"\n\n - %@", [exception callStackSymbols]); NSLog(@"\n\n - %@", [exception callStackReturnAddresses]); } 

但是通过使用这些,我没有得到崩溃的线,因为我打算把它保存在CoreData中。

另外我对xcode aproaches不感兴趣:“添加exception断点”或其他aproaces为:XCode>窗口>设备>查看设备上的崩溃日志,testing飞行aproaches或在应用程序中实施其他框架Crashlytics。

我提到这些是因为我对可以通过代码完成的方式非常感兴趣。

当应用程序存档被创build时,我们也能够获取应用程序的dsym,并使用使用Bash编写的RunScript将其上传到服务器。 所以我可以使用dsym,如果需要实现crash行的话。

另外我知道下一个aproach可以用来获取当前的代码行: LINE和_FUNCTION__来获取函数名称。

另外如果你可以从开源的PLCrashReporter提供代码示例,他们是如何做到这一点,我会大大apreciate。

比你提前一切! 🙂

基本上有两种types的崩溃:

  1. 未捕获的exception,可以通过类似于您的代码来捕获exception
  2. 基于信号的崩溃,可以捕捉信号处理程序(或马赫exception处理程序,但不会捕获所有信号)

然后捕获任何这些崩溃,你需要获得堆栈跟踪(所有线程)。 [NSException callStackSymbols]会给你一些符号(仅用于exception崩溃),对于很多操作系统符号,它只会显示redacted ,对于你的应用程序,它将提供一些符号,如果你不从你的二进制文件中去除它们。 build议从二进制文件中去除符号以减小(大量)文件大小,而且这些符号也永远不会提供文件名和行号。

因此,您需要从堆栈帧中获取以下信息:二进制,二进制UUID,CPU架构和内存地址。 [NSException callStackReturnAddresses]将给你的内存地址,但只为一个基于exception的崩溃。 另外它不提供对应于存储器地址的二进制图像。

所以你需要获得每个二进制映像所覆盖的内存地址范围的二进制映像列表,也是一种获取线程堆栈帧的内存地址的方法,也可用于基于非exception的崩溃。 如果想要了解这是怎么回事,基本上可以看看所有的PLCrashReporters代码,因为这是开源项目的目的,而不是StackOverflow的范围来解释这样复杂的场景。 阅读代码,文档和学习:)为了给你短小的要点:不要自己动手,只需使用PLCrashReporter。

现在要获取包括文件名和行号的符号,需要使用相应操作系统版本的操作系统符号和发生崩溃报告的设备的相应CPU架构来表示崩溃报告。 此外,您还需要从应用程序触发崩溃报告的确切二进制文件(和框架)中的符号(dSYM)包。 每个二进制映像都有一个唯一的UUID,并且您正在使用的符号文件使符号需要具有相同CPU架构的相同UUID。

现在您需要运行atos工具,从特定的符号文件中获取特定内存地址的符号。 以下堆栈溢出答案显示如何执行此操作: https : //stackoverflow.com/a/13576028/474794

作为替代scheme,您可以使用Xcode附带的symbolicatecrash.pl脚本,并采用Apple标准格式的崩溃报告(PLCrashReporter有一个转换工具,可以从更紧凑的报告中创build此类报告)。

你可以在你的日志中使用__PRETTY_FUNCTION__ ,这会给你函数的行,类和名字。

 NSLog(@"%@", __PRETTY_FUNCTION__); 

您可以使用任何其他您喜欢的信息填写日志的其余部分。