1.添加通用断点
选择 BreakPoint Navigator,点击右下角的 ‘+’ ,然后在弹窗中选择 ‘Add Exception BreakPoint’
2.重写object的respondsToSelector方法
1.重写object的respondsToSelector方法,现实出现EXEC_BAD_ACCESS前访问的最后一个object.因为有时候程序崩溃根本不知错误发生在什么地方。
在可能出现问题的 .m 或者.mm 文件中加入以下代码
#ifdef DEBUG
-(BOOL) respondsToSelector:(SEL)aSelector {
printf("SELECTOR: %s\n", [NSStringFromSelector(aSelector) UTF8String]);
return [super respondsToSelector:aSelector];
}
#endif
在 other c flags中加入-D DEBUG(记住请只在Debug Configuration下加入此标记),这样当你程序崩溃时,Xcode的console上就会准确地记录了最后运行的object的方法。
3最终方案
EXC_BAD_ACCESS 错误,可以这么说,90%的错误来源在于对一个已经释放的对象进行release操作.那么我们应该启用 僵尸对象.方法如下:
Product->Scheme->Edit Scheme->Arguments 的 Environment Variables 中,增加标计位NSZombieEnabled设为YES)objc
通过活动监视器,拿到我们程序进程的 pid,后面一个参数是崩溃的地址。
sudo malloc_history pid 0x7a692620
终端提示,没有打印 MallocStackLogging
需要在 Xocde 中配置的.按照刚刚配置 NSZombieEnabled的位置和方式,添加一个参数:
MallocStackLoggingNoCompact 值设置为 YES
然后继续重新编译运行,查看 pid ,查看崩溃的内存地址。
见到终端打印出了调用顺序,一般来说,是最后一个你自定义的方法导致的崩溃。