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的开发,服务器后台、前段的支持,最好使用已经现成的东东,比如网易云捕啥的,关键是还免费,多方便啊。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值