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

时间:2011-04-13 23:21:20

标签: 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

更多事实:

  • 我设置了NSZombieEnabled,但没有 在控制台中有所作为 输出
  • 我使用了 泄漏概况,它没有显示任何 泄漏

2 个答案:

答案 0 :(得分:11)

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

我添加了三个环境变量。

  • NSZombieEnabled
  • NSAutoreleaseFreedObjectCheckEnabled
  • NSDebugEnabled

所有这些都设置为YES

这是我所采用路径的链接。

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

如果您使用的是XCode 4,那么您将在编辑方案弹出窗口的Arguments部分中添加这些。

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

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

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

通常我会释放对象然后将它们设置为nil,这样如果我稍后发布它们,我就不会有任何问题,因为如果你自动释放nil,你就会得到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.

答案 1 :(得分:0)

最可能的原因是在Autorelease池中添加垃圾或已释放的对象 - 可能在PurpleEventCallback函数中?