XCode4如何解决调试程序时,忽然崩溃,而找不到崩溃的代码

本文介绍了使用XCode4进行内存调试的有效方法,包括设置调试参数以获取更详细的错误信息,以及避免常见的内存管理问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

XCode4设置不太一样: 在Edit-->Scheme里面 找到Arguments

把下面3个值设置成YES

NSAutoreleaseFreedObjectCheckEnabled

NSZombieEnabled
NSDebugEnabled

这种方法非常好用,建议在建立一个工程的时候,加入此设置。















出现 EXC_BAD_ACCESS  错误,给你的错误提示就这个,如何根本没法知道哪里错误了,其实还是有方法知道的,

做如下设置:

Project -> Edit active executable ->Argument 

添加如下四个参数

NSDebugEnabled

NSZombieEnabled

MallocStackLogging 

MallocStackLoggingNoCompact

并都设置为YES。具体如下图:

 

  这个时候,如果有如下一段代码:

 //重复释放一个变量 

  NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];

  NSData* data = [NSData dataWithBytes:"asklaskdxjgr" length:12];

  [data release];

  [pool release];

再Debug窗口会有如下的提示

   2003-03-18 13:01:38.644 autoreleasebug[3939*** *** Selector 'release'

  sent to dealloced instance 0xa4e10 of class NSConcreteData.

 

虽然也能大致判断是哪种类型的变量重复释放了,但信息还不够多,当项目大,源码比较多的时候,也不太方便定位,

在console窗口运行如下命令可以得到更多信息:shell malloc_history <pid> <address>"

 输入命令:shell malloc_history3939 0xa4e10

 就会出现更多的信息:

  [dave@host193 Frameworks]$ malloc_history 3939 0xa4e10

  Call [2] [arg=32]: thread_a0000dec |0x1000 | start | _start | main |

  +[NSData dataWithBytes:length:] | NSAllocateObject | object_getIndexedIvars |

  malloc_zone_calloc  

这个时候就知道具体哪个函数出先问题了,从这里可以看到main里NSData出现问题了。 

 

2. NSArray等集合类的实用问题。

      如下面的代码    

        ReleaseTest* rt = [[allocinit];

NSMutableArray *array = [[NSMutableArray allocinit] ;

[array addObject: rt];

ReleaseTest *rt2 = [array objectAtIndex:0];

      [rt2 release];   

[array release];

[rt release]; 

     就会导致重复释放内存问题,因为rt2,获取的是一个对象的指针,如果已经释放了的话,rt在释放的话,就重复了,为了遵循谁Init谁Release的原则,rt2就不应该Release。

 

3. init 和 Release 的问题。

    凡是对象通过Init的方法生成的对象,都需要自己负责Release。

    凡不是通过Init的方法生成的对象,不需要负责Release.如[NSString StringWithFormat]方法生成的对象就不需要自己Release,因此自己定义函数,返回一个类的时候,一定要设置为autoRelease 。这样调用的人就不用操心是否需要释放对象了。

 4. AutoReleasePool里最好不要将AutoRelease对象赋值给其它对象,否则离开这个作用域后,对象将会Release掉。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值