如何调试EXC_BAD_ACCESS错误

时间:2013-11-02 08:25:09

标签: objective-c xcode lldb

我收到了错误

EXC_BAD_ACCESS代码= 2 at0xb0987654

我想知道如何打印出0xb0987654的值?

3 个答案:

答案 0 :(得分:32)

要调试EXC_BAD_ACCESS,通常可以通过启用僵尸对象找出悬空指针的位置。

<强>的Xcode

选择编辑方案,然后选择“运行”部分中的“诊断”选项卡,然后单击“Zombie Objects”选项。

<强> AppCode

选择编辑目标,并添加以下环境变量:

NSZombieEnabled=YES

EXC_BAD_ACCESS的另一个原因可能是无限递归,可以通过添加一些日志来找到。

C ++更新:

要使用Clang编译器调试C ++中的悬空指针,请尝试使用Google的Address Sanitizer (ASAN)

答案 1 :(得分:2)

看起来您可能正在尝试写入代码页或其他内容? EXC_BAD_ACCESS在/usr/include/mach/exception_types.h中描述:

#define EXC_BAD_ACCESS          1       /* Could not access memory */
            /* Code contains kern_return_t describing error. */
            /* Subcode contains bad memory address. */

来自kern_return.h:

#define KERN_PROTECTION_FAILURE         2
            /* Specified memory is valid, but does not permit the
             * required forms of access.
             */

您可以通过执行以下操作来查看二进制文件中的地址:

(lldb) image lookup -va 0xb0987654

但你真正需要弄清楚的是谁在那里写作。如果问题很简单,这可能会告诉你什么是错的,但正如贾斯帕所说,这可能是一些免费使用或其他类似的问题,而且当你崩溃时,糟糕的演员早已消失。 guardmalloc有时也可以捕获这种错误(你可以在Run方案中的Xcode中启用它。)

答案 2 :(得分:0)

确定导致崩溃的原因。在查看特定视图控制器didLoad或委托方法或特定操作时是否崩溃。这通常有助于找到导致错误的对象。

  • 大多数时候,“NSZombies”可以帮助识别死亡对象。您可以通过编辑方案Product - &gt;来启用NSZombies。编辑方案 - &gt;诊断
  • 如果仍然找不到根本原因,那么请始终从子视图控制器向后转到父视图控制器,以查看需要保留的对象或需要正确传递的消息。
  • 查看静态分析器和仪器以进行高级调试。

我希望这会对你有所帮助。

此致 吉生