博客> 抓iOS设备上的一个偶现崩溃
抓iOS设备上的一个偶现崩溃
2018-07-15 15:02 评论:0 阅读:509 jisongzdd
崩溃 crash app 调试 应用 堆栈 exception crashlytics

昨天在调试ios代码的时候,测试跟我他的手机会偶现崩溃。既然是偶现,就比较麻烦,冷静下来。想着计划,第一步打算是在IDE里面调试重现,这个是最好的方式了,没有比在IDE里面查找崩溃还方便的方式 第二步,如果这一步走不通,接入sdk,通过他来获取堆栈信息,丢给测试去试试,等待一次崩溃,从而从堆栈信息里面进一步分析崩溃的位置。抱着侥幸心理我试图在IDE里面重现测试,也许是运气比较好,真的被我给重现了,但是很快就失落了,堆栈的图如下:

 WechatIMG5.png

我看到这里面几乎没有什么有用的信息,除了main函数里面可见的代码,其余都是汇编后的语言,心凉了半截,这些只有名称不可见的源码都是苹果公司未开源的内容,无法入手。所以基本上对调试毫无用处。之内另寻他路了。

我需要从IDE里面捕捉更多的信息,幸运的是,我的崩溃是SIGABRT种情况(这个我会在下一个帖子详细说明),这样它在调试输出窗口有明显的输出日志。如图:

 WechatIMG8.png

从这里发现两个重点 1.它是由一个exception抛出的错误 2.他是由于initWithObjects在设置的时候遇到了一个nil的参数,导致的crash。那么剩下来的就是找到哪里传了nil参数 由于抛出了exception,所以我可以将xcode的调试exception的断点打开,这样就会在所有的异常击中断点,方法如下:  WechatIMG9.png

图中有➕号的,并选中exception breakpoint

 WechatIMG1.png

添加了之后,我们就会看到上面有一个all exception的断点,所有的exception都会中断,并在中断的代码位置有堆栈信息。运行,完美看到堆栈的信息,如图  WechatIMG2.png

看到崩溃定位,很明显看到其中的一个参数为nil  WechatIMG3.png 根本原因是ipAddress在上一步获取到ip的时候出错了,导致用了未初始化的一个nil。与预期的结果是一致的。 如果说有些问题,还是不可以用IDE来捕获的话,比如很偶现的问题,可以通过嵌入第三方库来捕获,比如说crashlytics库。如何加这个的文档还是挺多这就不赘述了。

收藏
0
sina weixin mail 回到顶部