如何调试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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容