EXC_BAD_ACCESS之NSZombieEnabled以及全局断点调试

 
iPhone开发 EXC_BAD_ACCESS之NSZombieEnabled以及全局断点调试

兄弟伙些,这两天把我郁闷惨了,一直都要报个错:对象已经释放,因为这个这两天血压一直飙升,因为公司人事上的问题,我只有一个人慢慢研究,都一度想XX,结果刚刚发现自定义的一个类,因为把一个int属性改为了NSString,但是在property中还是用的assign,导致这个属性自动就释放了;   哎,看来还要多磨练才行,长个记性了!还有就是一定要把那个内存释放的调试配置好,这才好找错!

 

 

下面就转帖别人的配置内存释放的;

一、首先是设置NSZombieEnabled,它有助你找到哪个对象释放了


至于NSZombieEnabled,就是当设置NSZombieEnabled环境变量后,一个对象销毁时会被转化为_NSZombie,个人感觉和线程的那几个状态有些相似,设置NSZombieEnabled后,当你向一个已经释放的对象发送消息,这个对象就不会向之前那样Crash或者产生一个难以理解的行为,而是放出一个错误消息,然后以一种可预测的可以产生debug断点的方式消失(原文是die),因此我们就可以找到具体或者大概是哪个对象被错误的释放了。

设置NSZombieEnabled的方法如下

  1. 在XCode左边那个Groups & Files栏中找到Executables,双击其中的一项,或者右键Get Info;
  2. 切换到Arguments
  3. 这里一共有两个框,在下面那个Variables to be set in the environment:点+号添加一项,Name里填NSZombieEnabled,Value填Yes,要保证前面的钩是选中的。

好了,赶紧去找哪里出了问题吧,至于取消NSZombieEnabled,就是吧刚才提到的那个钩取消即可。

最后总结一下感想,首先是我对EXC_BAD_ACCESS这个错误还没有足够的认识,其次是我没有尽快的去搜索一下解决方法,这两点导致我浪费了大量时间做各种各样奇怪的调试。幸好现在解决了,可以继续工作了。

 

二、设置全局断点

很多时候,在调试程序的时候,我们很想马上知道错误的代码在哪一行。 而不想大概设置一个断点,逐行调试发现最终是哪一行代码出问题导致程序崩溃。 可以使用下面这个办法快速定位问题代码。

选择Run–>Show–>Breakpoints,进入断点窗口


首先需要为-[NSException raise]创建一个断点。 选择Global Breakpoints, 双击Double-click for Symbol框, 输入-[NSException raise],然后按return键。


其次,再按照上面的步骤添加另外一个全局断点objc_exception_throw。

现则,运行的程序有异常抛出的时候,调试器就会中止程序运行并指向有问题的代码行。

转自:http://hi.baidu.com/%CB%BC%C3%F4%D3%EA/blog/category/iphone%BF%AA%B7%A2

你可能感兴趣的:(iphone开发)