ACCESSEXD_BAD_ACCEEE

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的章程。

  1. 通过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,如图:

ACCESS 1

 

本次可以看来题目是”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音讯,如下图是与本程序相关的:

ACCESS 2

依照这一个音讯我们就足以找到题目出现在[BadAccessViewController
viewDidLoad] 中与 +[NSString stringWithFormat:] 有关的地方.

最后大家记念把环境变量NSZombieEnabled,MallocStackLogging删除或安装为NO,因为它们会使得内存不会被真人真事释放.

3、设置全局断点神速定位问题代码所在行

XCode调试技巧–设置全局断点快捷定位问题代码所在行

注:转载  stackoverflow

 

相关文章