当将应用程序部署到设备时,程序将在几个周期后退出,并出现以下错误:
Program received signal: "EXC_BAD_ACCESS".
程序在iPhone模拟器上运行没有任何问题,只要我一次执行一个指令,它也会调试和运行。一旦我让它再次运行,我将击中EXC_BAD_ACCESS信号。
在这种特殊情况下,它恰好是加速度计代码中的一个错误。它不会在模拟器中执行,这就是它不会抛出任何错误的原因。但是,它将在部署到设备后执行。
这个问题的大多数答案都处理一般的EXC_BAD_ACCESS错误,因此我将保留这个选项,作为可怕的坏访问错误的统称。
EXC_BAD_ACCESS通常是非法内存访问的结果。你可以在下面的答案中找到更多信息。
您以前遇到过EXC_BAD_ACCESS信号吗?您是如何处理它的?
我刚刚花了几个小时跟踪一个EXC_BAD_ACCESS,发现NSZombies和其他env vars似乎没有告诉我任何东西。
对我来说,这是一个愚蠢的NSLog声明与格式说明符,但没有参数传递。
NSLog(@"Some silly log message %@-%@");
固定的
NSLog(@"Some silly log message %@-%@", someObj1, someObj2);
EXC_BAD_ACCESS的主要原因是试图访问已释放的对象。
要了解如何排除此故障,请阅读本文档:
DebuggingAutoReleasePool
即使你不认为你在“释放自动释放的对象”,这也适用于你。
这个方法非常有效。我一直在用它,而且非常成功!!
总之,这解释了如何使用Cocoa的NSZombie调试类和命令行“malloc_history”工具来查找在代码中被访问的释放对象。
Sidenote:
运行仪器和检查泄漏将无助于排除EXC_BAD_ACCESS故障。我非常确定内存泄漏与EXC_BAD_ACCESS无关。泄漏的定义是您不再具有访问权限,因此不能调用它的对象。
更新:
我现在使用Instruments来调试泄漏。在Xcode 4.2中,选择Product->Profile,当Instruments启动时,选择“Zombies”。