当我无法确定原因时,如何在iPhone应用程序中调试EXC_BAD_ACCESS?

Jay*_*man 7 iphone debugging exc-bad-access

帮助,我已经在这几周乱砍了!我有这个应用程序我在模拟器中开发,我已经做了很多UI的东西,它只是与数据有趣的部分.它在启动时立即启动,大约90%的时间我运行它,它会引发EXC_BAD_ACCESS异常.

我已经注释掉了我的所有发布消息,甚至还添加了一些保留消息,以确保它不会过度发布.奇怪的是,有时我在代码中做的事情会使它工作,然后它会工作,直到我再次进行代码更改.然后我注释掉我添加的新代码,它仍然崩溃.

我已经在网上阅读了十几篇关于此的文章,尝试了他们建议的内容.我设置了断点,仍然无法弄清楚它在哪里.当我在调试器中单击调用堆栈时,显示源代码的唯一位置是主要的底层.

调试器有这个堆栈,但每次崩溃时都会有一点波动.不一致的性质告诉我有一些记忆它是自动释放的,但我不知道如何找出什么.

0 objc_msgSend
1 ??
2 _CFAutoReleasePoolPop
3 -[NSAutoReleasePool release]
4 _UIApplicationHandleEvent
5 PurpleEventCallback
6 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__
7 __CFRunLoopDoSource1
8 __CFRunLoopRun
9 CFRunLoopRunSpecific
10 CFRunLoopRunInMode
11 -[UIApplication _run]
12 UIApplicationMain
13 main
Run Code Online (Sandbox Code Playgroud)

还有一些事实:

  • 我设置了NSZombieEnabled,这在控制台输出中没有任何区别
  • 我使用泄漏配置文件运行仪器,它没有显示任何泄漏

The*_*der 11

您将需要在代码中启用僵尸对象,并且检查自动释放的对象,以及启用调试可能会有所帮助.

我添加了三个环境变量.

  • NSZombieEnabled
  • NSAutoreleaseFreedObjectCheckEnabled
  • NSDebugEnabled

所有这些都设置为YES

这是我走的路径的链接.

http://www.codza.com/how-to-debug-exc_bad_access-on-iphone

如果您使用的是XCode 4,那么您将在Edit Schemes弹出窗口的Arguments部分中添加这些内容.

另外需要注意的是,您应该只释放或自动释放您保留的对象.您保留以下对象的保留.

  • 你分配的任何对象[NSObject alloc]
  • 使用静态新命令[NSObject new]获得的任何对象
  • 您明确保留的任何对象[myObject retain]
  • 对象的任何副本[myObject copy]
  • 具有retain或copy属性的任何属性@property(retain)NSString*myProperty;

如果您向其他任何对象发送自动释放,您可以随机结束此错误和其他错误.

通常我释放对象,然后将它们设置为零,这样如果我稍后释放它,我不会有任何问题,因为如果你autorelease nil,你会得到零.

NSObject *myObject = [incomingObject retain];
// Do something with the object.
[myObject autorelease];
[myObject autorelease]; // This line will end in an error down the line when the object is released past 0, or when the release pool is drained.
myObject = nil;
[myObject release]; // This line will do nothing. no error, no effect.
Run Code Online (Sandbox Code Playgroud)