如何调试BAD_ACCESS错误?

首先说一下 EXC_BAD_ACCESS 这个错误,可以这么说,90%的错误来源在于对一个已经释放的对象进行release操作。你需要在每个object(或者用Method Swizzling自己搜方法,可以不用每个object都写)的.m或者.mm文件中加入上面代码,并且在 other c flags中加入-D FOR_DEBUG(记住请只在Debug Configuration下加入此标记)。这样当你程序崩溃时,Xcode的console上就会准确地记录了最后运行的object的方法。

#ifdef _FOR_DEBUG_  
-(BOOL) respondsToSelector:(SEL)aSelector {  
    printf("SELECTOR: %s\n", [NSStringFromSelector(aSelector) UTF8String]);  
    return [super respondsToSelector:aSelector];  
}  
#endif 

1.重写object的respondsToSelector方法,现实出现EXEC_BAD_ACCESS前访问的最后一个object。
2.打开“僵尸模式”能迅速定位。有时候只会打印这样一句:

message sent to deallocated instance 0x7ff8fdd2f9c0
//0x7ff8fdd2f9c0就是这个对象

此时可以在终端输入以下命令来查找

输入:sudo malloc_history 1527 0x7ff8fdd2f9c0
如何调试BAD_ACCESS错误?_第1张图片

3.设置全局断点快速定位问题代码所在行。
4.Xcode 7 已经集成了BAD_ACCESS捕获功能:Address Sanitizer。 用法如下:在配置中勾选✅Enable Address Sanitizer。
5.通过instruments的Zombies。具体查看https://www.jianshu.com/p/51188549ff06。

你可能感兴趣的:(如何调试BAD_ACCESS错误?)