记一次随机EXC_BAD_ACCESS崩溃排查

说到排查BAD_ACCESS崩溃,我们可能首先会想到使用Zombie来进行定位。但是这种方式只能适用于崩溃到同一个位置的时候。

如果我们遇到的crah是随机的怎么办呢?

首先我们要知道随机BAD_ACCESS产生的原因。当访问野指针、被损坏的内存区域等无法执行消息的内存时,便会出现BAD_ACCESS

当这个问题随机产生,崩溃到不同对象上时,就需要考虑是否是内存分配上的问题。因为每次启动对象创建的先后顺序会有差异,因此有内存错误时出错的对象便会不一样。

为了确认这个问题,我们开启Address Sanitizer

这是Xcode7集成的内存分析功能,比Zombie有更强的捕获能力。多次运行,会发现都会停止在同一地方。而且都是同样的错误heap_buffer_overflow

这个地方是我们调用了一个底层C++库的地方,并且有手动分配内存的操作。

通过与底层库的排查,我们发现是由于定义不一致,导致一个结构体里有个字符串分配了256的内存,而底层写入时以1024大小来写入,导致了内存溢出。这使后面分配给其他对象的内存区域被破坏,出现随机的BAD_ACCESS错误。

小结

如果不是手动操作内存,出现随机BAD_ACCESS问题概率还是比较低的。当Zombie不能解决问题时,可以使用Address Sanitizer进行更深的分析。

平时开发中,我们需要关注工具新特性的更新,用好了工具,在辅助我们分析问题时会有事半功倍的效果。