xcode 如何调试EXC_BAD_ACCESS错误

2ekbmq32  于 2022-11-18  发布在  其他
关注(0)|答案(3)|浏览(161)

我收到错误
在0xb0987654处,EXC_BAD_ACCESS代码=2
我想知道如何打印出0xb0987654处的值?

myss37ts

myss37ts1#

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

X代码

Product > Scheme > Edit Scheme

然后,配置如下👇🏼

应用程序代码

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

NSZombieEnabled=YES

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

针对C++得更新:

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

q7solyqu

q7solyqu2#

看起来您可能正在尝试写入代码页或其他内容?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. */

并从克恩_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有时也能捕捉到这类错误(你可以在Xcode的Run方案中启用它)。

piztneat

piztneat3#

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

  • 大多数情况下,“NSCombies”可以帮助识别死对象。您可以通过编辑您的方案产品-〉编辑方案-〉诊断来启用NSCombies。
  • 如果你仍然没有找到根本原因,那么总是从子视图控制器回到父视图控制器,看看需要保留什么对象,或者需要正确传递什么消息。
  • 查看静态分析器和仪器,了解高级调试。

希望这对你有帮助。
此致,吉森

相关问题