IOS 崩溃日志收集

通过崩溃捕获和收集,可以收集到已发布应用(游戏)的异常,以便开发人员发现和修改bug,对于提高软件质量有着极大的帮助,本文主要介绍iOS平台下崩溃捕获和收集的原理及步骤。

要实现崩溃捕获和收集的步骤如下:

      1、捕获崩溃

      2、获取堆栈信息

      3、符号表还原

      4、服务器上传


捕获异常

iOS中引发崩溃的代码本质上就两类,一个是c++语言层面的错误,属于比较底层的错误,比如野指针,除零,内存访问异常等等,这一类的错误可以通过信号机制来捕获(signal或者是sigaction),即任何系统错误都会抛出一个错误信号,我们可以通过设定一个回调函数,然后在回调函数里面进行自己的处理;另一类是未捕获异常(Uncaught Exception),iOS下面最常见的就是objective-c的NSException,比如,数组访问元素越界。这些异常如果没有在最上层try住,那么程序就崩溃了。

针对NSException的捕获,通过调用NSSetUncaughtExceptionHandler来捕获,系统错误通过注册signal来捕获,一般产生一个NSException的异常的时候,同时也会抛出一个signal的信号。

如果要做得全面,除了处理Object-C项目,还需要处理Swift语言编写的项目,另外还有就是U3D的工程,移动游戏开发很多都是使用这个。


获取堆栈信息

但捕获到程序的异常后,我们需要解析app崩溃时的环境,即崩溃堆栈。

NSException的异常比较简单,直接获取崩溃name,reason和callstack;signal的堆栈的处理就比较麻烦些;另外,还就是需要分析APP的当前线程信息以及所有的线程信息或者更加深一步的寄存器信息。不过这个时候拿到的堆栈是地址的形式,还需要第三步的符号表还原功能才能定位到代码行号。


注意:在分析堆栈信息时需要区分32位和64位,以及分别处理真机和模拟器的堆栈,因为一个是arm架构,一个是x86_ 64。


符号表还原

符号表还原包括系统符号表和App自己的符号表这两类。

系统符号表的话,比较坑爹,需要有不同系统版本的手机,分别拿到他们的系统符号表,解析出来,没有找到一个Apple提供的统一系统symbol文件下载地址;App的符号表,Build的时候都会生成。通过分析dwarf文件架构,解析出对应的符号表,然后和第二步的结果比照还原


服务器上传

       这个就比较简单了,略过。

如果想完整的实现整个流程还是比较费时费力,需要SDK的开发,服务器后台、前段的支持,最好使用已经现成的东东,比如网易云捕啥的,关键是还免费,多方便啊。

你可能感兴趣的:(IOS 崩溃日志收集)