2013-11-02 65 views
23

我收到了一条错误如何调试EXC_BAD_ACCESS错误

EXC_BAD_ACCESS码= 2 at0xb0987654

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

+0

我想在这个地址,你不想打印出来的值,因为这很地址是摆在首位你的问题。什么*让你在那里*是要问的问题。 – Jay

回答

30

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

的Xcode

选择编辑方案,在运行部分则诊断选项卡,然后单击“僵尸对象”选项。

AppCode

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

NSZombieEnabled=YES 

为EXC_BAD_ACCESS另一个原因可以是无限递归,其可以通过加入一些测井中找到。

更新C++:

要调试悬空在C指针++与锵编译器尝试使用Address Sanitizer (ASAN)来自谷歌。

+2

我试过了,没用。因为它是导致问题的C++代码。 –

+0

@AdamLee然后呢? http://stackoverflow.com/questions/3199067/c-catching-dangling-reference –

+0

@AdamLee,Oops看起来像MudFlap是gcc只,更新为Clang/llvm –

2

它看起来像也许你正试图写入代码页或什么? EXC_BAD_ACCESS在/usr/include/mach/exception_types.h描述:做

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

你可以看到该地址是在您的二进制文件:

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

而且从kern_return.h

(lldb) image lookup -va 0xb0987654 

但是你真正需要弄清楚的是谁在试图写在那里。如果问题很简单,这可能会告诉你什么是错误的,但正如贾斯珀所说,这可能是一些免费使用或其他类似问题,并且在你崩溃的时候,这个坏角色早已消失。 guardmalloc有时也会遇到这种错误(您可以在运行方案的Xcode中启用此功能。)

+7

'在lldb中,图像查找-va 0x1586470c4'完全没有输出,甚至没有输出错误信息。 –

+0

目前,“图像查找-a”只是在给定的地址打印它可以找到的内容,即使在“没有符号在这个地址”的情况下,当这是没有的时候......当LLDB不能打印时,它应该打印一些错误找到与给定地址关联的任何符号。请用Apple的bug记者或lldb.llvm.org bugzilla提交一份关于此问题的bug。谢谢。 –

0

确定您做了什么导致了崩溃。在特定视图控制器的视图执行加载或委托方法或特定操作时,它是否崩溃?这通常会帮助找到产生错误的对象。

  • 大部分时间“NSZombies”都可以帮助识别死对象。您可以通过编辑您的方案产品 - >编辑方案 - >诊断来启用NSZombies。
  • 如果仍然没有找到根本原因,那么总是从子视图控制器向后返回到父视图控制器,以查看需要保留哪些对象或需要正确传递哪些消息。
  • 查看静态分析仪和仪器进行高级调试。

我希望这会帮助你。

问候, 吉生