当将应用程序部署到设备时,程序将在几个周期后退出,并出现以下错误:

Program received signal: "EXC_BAD_ACCESS".

程序在iPhone模拟器上运行没有任何问题,只要我一次执行一个指令,它也会调试和运行。一旦我让它再次运行,我将击中EXC_BAD_ACCESS信号。

在这种特殊情况下,它恰好是加速度计代码中的一个错误。它不会在模拟器中执行,这就是它不会抛出任何错误的原因。但是,它将在部署到设备后执行。

这个问题的大多数答案都处理一般的EXC_BAD_ACCESS错误,因此我将保留这个选项,作为可怕的坏访问错误的统称。

EXC_BAD_ACCESS通常是非法内存访问的结果。你可以在下面的答案中找到更多信息。

您以前遇到过EXC_BAD_ACCESS信号吗?您是如何处理它的?


当前回答

我发现在objc_exception_throw上设置断点很有用。这样,当您获得EXC_BAD_ACCESS时,调试器应该会中断。

说明可以在这里找到调试技术

其他回答

检查错误可能是什么

使用NSZombieEnabled。

在你的应用程序中激活NSZombieEnabled工具:

选择项目>编辑活动可执行文件打开可执行文件信息窗口。 点击参数。 点击“Variables to be set in the environment”部分中的添加(+)按钮。 “名称”一栏输入“NSZombieEnabled”,“值”一栏输入“YES”。 确保NSZombieEnabled条目的复选标记被选中。

我在iphoneonesdk上找到了这个答案

在EXC_BAD_ACCESS异常发生之前捕捉异常的另一种方法是XCode 4+中的静态分析器。

使用Product > Analyze (shift+cmd+B)运行静态分析器。 单击分析器生成的任何消息将在您的源上覆盖一个图表,该图表显示了保留/释放违规对象的顺序。

EXC_BAD_ACCESS的主要原因是试图访问已释放的对象。

要了解如何排除此故障,请阅读本文档: DebuggingAutoReleasePool

即使你不认为你在“释放自动释放的对象”,这也适用于你。

这个方法非常有效。我一直在用它,而且非常成功!!

总之,这解释了如何使用Cocoa的NSZombie调试类和命令行“malloc_history”工具来查找在代码中被访问的释放对象。

Sidenote:

运行仪器和检查泄漏将无助于排除EXC_BAD_ACCESS故障。我非常确定内存泄漏与EXC_BAD_ACCESS无关。泄漏的定义是您不再具有访问权限,因此不能调用它的对象。

更新: 我现在使用Instruments来调试泄漏。在Xcode 4.2中,选择Product->Profile,当Instruments启动时,选择“Zombies”。

再补充一种可能发生这种情况的情况:

我有密码:

NSMutableString *string;
[string   appendWithFormat:@"foo"];

显然,我忘记了为字符串分配内存:

NSMutableString *string = [[NSMutableString alloc] init];
[string   appendWithFormat:@"foo"];

解决问题。

EXC_BAD_ACCESS信号是向系统调用传递无效指针的结果。我今天早些时候在OS X上用一个测试程序得到了一个-我传递了一个未初始化的变量到pthread_join(),这是由于早期的拼写错误。

我不太熟悉iPhone开发,但是你应该仔细检查你传递给系统调用的所有缓冲指针。一直提高编译器的警告级别(使用gcc时,使用-Wall和-Wextra选项)。在模拟器/调试器上启用尽可能多的诊断。