iOS开发进程中,普通的bug日常较容易定位问题所在,可是,EXD_BAD_ACCEEE问题却相比较不利查找问题。本文记录下解决EXD_BAD_ACCEEE问题的历程。首先说一下
EXC_BAD_ACCESS
这一个似是而非,可以如此说,90%的不当来源在于对一个已经释放的对象开展release操作。
1.
重写object的respondsToSelector方法,现实出现EXEC_BAD_ACCESS前走访的末尾一个object
偶然程序崩溃根本不知错误发生在哪个地方。比如程序出现EXEC_BAD_ACCESS的时候,尽管大部分景色采用设定
NSZombieEnabled环境变量可以扶持你找到题目标到处,但个别情形下,即便设定了NSZombieEnabled环境变量,依然不晓得程序崩
溃在何地。那么就需要拔取下列代码举办救助了:
#ifdef _FOR_DEBUG_
-(BOOL) respondsToSelector:(SEL)aSelector {
printf("SELECTOR: %s\n", [NSStringFromSelector(aSelector) UTF8String]);
return [super respondsToSelector:aSelector];
}
#endif
您需要在各样object的.m或者.mm文件中进入地方代码,并且在 other c
flags中投入-D _FOR_DEBUG_(记住请只在Debug
Configuration下参与此标志)。这样当您程序崩溃时,Xcode的console上就会规范地记录了最后运行的object的章程。
- 通过NSZombieEnabled
深信不疑广大人都了然通过NSZombies来帮衬调节出现EXC_BAD_ACCESS的气象,但有时依旧找不到需要的信息,那么应该如何做吧?
下边通过一个事例来表达.下边是hello world的代码:
NSString* hello = [NSString stringWithFormat:@"Hello world"];
NSLog(@"What you say is %@",hello);
[hello release];
运行后出现EXC_BAD_ACCESS错误.但没有任何任何提醒,这时
候通过右击executables下的利用程序名,选拔get
info后,在arguments下输入环境变量(NSZombieEnabled,MallocStackLogging)
双重运行后先后crash,如图:
本次可以看来题目是”message sent to dealloced
object”了,但具体是哪些语句引起的还并不知道,于是需要在gdb上输入以下语句:
shell malloc_history pid address
那么pid和address是怎么呢?再看下crash的图样结合一下自我以下使用的授命,你应有神速就足以判明pid和address是从什么地方来的了,我的一声令下是:
shell malloc_history 596 0×5f3ef80
再次运行,程序crash时会出现大量的stack trace音讯,如下图是与本程序相关的:
依照这一个音讯我们就足以找到题目出现在[BadAccessViewController
viewDidLoad] 中与 +[NSString stringWithFormat:] 有关的地方.
最后大家记念把环境变量NSZombieEnabled,MallocStackLogging删除或安装为NO,因为它们会使得内存不会被真人真事释放.
3、设置全局断点神速定位问题代码所在行
XCode调试技巧–设置全局断点快捷定位问题代码所在行