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

Program received signal: "EXC_BAD_ACCESS".

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

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

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

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

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


当前回答

XCode 4及以上版本,它已经通过Instruments变得非常简单了。在仪器中运行僵尸。本教程很好地解释了它:调试exc_bad_access错误xcode工具

其他回答

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

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

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

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

甚至还有另一种可能:在队列中使用块,很容易发生你试图访问另一个队列中的对象,这个对象此时已经被取消分配了。通常当你试图向GUI发送一些东西时。 如果异常断点设置在一个陌生的位置,那么这可能是原因所在。

我只是在试图执行一个包含大数组的C方法时,才在iPhone上遇到了EXC_BAD_ACCESS。模拟器可以给我足够的内存来运行代码,但设备却不行(数组有一百万个字符,所以有点多了!)

EXC_BAD_ACCESS恰好出现在方法的入口点之后,让我困惑了好一阵子,因为它不在数组声明附近。

也许其他人能从我这几个小时的拔头发中获益。

EXC_BAD_ACCESS

EXC_BAD_ACCESS访问已经释放的对象。内核发送这个异常(EXC),表示内存块不能被访问(BAD ACCESS)。

使用[无主(不安全)] 当一个目标器使用另一个目标器时,IPHONEOS_DEPLOYMENT_TARGET[About]。在我的例子中,Test target(10.0)使用了显式依赖[About]与14.0 IPHONEOS_DEPLOYMENT_TARGET