30

我收到一个错误

EXC_BAD_ACCESS 代码=2 at0xb0987654

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

4

3 回答 3

35

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

Xcode

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

应用代码

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

NSZombieEnabled=YES

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

C++ 更新:

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

于 2013-11-02T08:28:01.097 回答
4

看起来您可能正在尝试写入代码页或其他内容?/usr/include/mach/exception_types.h 中描述了 EXC_BAD_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:

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

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

(lldb) image lookup -va 0xb0987654

但是你真正需要弄清楚的是谁在试图在那里写作。如果问题很简单,这可能会告诉您出了什么问题,但正如 Jasper 所建议的那样,这可能是一些释放后使用或其他此类问题,并且当您崩溃时,坏演员早就消失了。guardmalloc 有时也可以捕捉到这种错误(你可以在 Xcode 的 Run 方案中启用它。)

于 2013-11-07T20:43:05.223 回答
0

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

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

我希望这能帮到您。

问候, 吉森

于 2014-11-28T09:33:19.080 回答