如何调试 EXC_BAD_ACCESS 错误
Posted
技术标签:
【中文标题】如何调试 EXC_BAD_ACCESS 错误【英文标题】:How to debug EXC_BAD_ACCESS bug 【发布时间】:2013-11-13 10:43:48 【问题描述】:我收到一个错误
EXC_BAD_ACCESS 代码=2 at0xb0987654
我想知道如何打印出 0xb0987654 处的值?
【问题讨论】:
我想您不想打印出该地址的值,因为该地址首先是您的问题。 让你到达那里是要问的问题。 【参考方案1】:要调试 EXC_BAD_ACCESS,您通常可以通过启用僵尸对象来找出悬空指针的位置。
Xcode
选择编辑方案,然后选择运行部分中的诊断选项卡,然后单击“僵尸对象”选项。
应用程序代码
选择编辑目标,并添加以下环境变量:
NSZombieEnabled=YES
EXC_BAD_ACCESS 的另一个原因可能是无限递归,这可以通过添加一些日志记录来找到。
C++ 更新:
要使用 Clang 编译器在 C++ 中调试悬空指针,请尝试使用来自 Google 的 Address Sanitizer (ASAN)。
【讨论】:
@AdamLee 那么这个怎么样? ***.com/questions/3199067/… @AdamLee,哎呀,MudFlap 似乎只是 gcc,已针对 Clang/llvm 进行了更新 曾经让 AddressSanitizer 与 Xcode 一起工作吗?在我尝试过的所有 Xcode 版本中,Apple 包含的“特殊”clang 版本不支持-fsanitize
..
@Jay 最近没试过。 .最近主要是 ObjC。找到任何解决方法或其他方法?
@JasperBlues 在这些日子里,我只是使用 Instruments 模板来处理任何类型的 Obj-C 内存错误。多年的经验、广泛的错误检查以及大量的错误日志记录,C++ 错误.....【参考方案2】:
看起来您可能正在尝试写入代码页或其他内容? /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 方案中启用它。)
【讨论】:
image lookup -va 0x1586470c4
in lldb 根本没有给我任何输出,甚至没有错误消息。
目前“image lookup -a”只打印它可以在给定地址找到的内容,即使在“该地址没有符号”的情况下,什么都不是...... LLDB 应该真正打印当它找不到与给定地址关联的任何符号时出现一些错误。请向 Apple 的错误报告者或 lldb.llvm.org bugzilla 提交有关此问题的错误。谢谢。【参考方案3】:
确定导致崩溃的原因。它是否在查看特定视图控制器 didLoad 或委托方法或特定操作时崩溃。这通常有助于找到导致错误的对象。
大多数时候,“NSZombies”可以帮助识别死物。您可以通过编辑方案 Product -> Edit Scheme -> Diagnostics 来启用 NSZombies。 如果您仍然找不到根本原因,请始终从子视图控制器返回到父视图控制器,以查看需要保留哪些对象或需要正确传递哪些消息。 查看静态分析仪和仪器以进行高级调试。希望对你有所帮助。
问候, 吉森
【讨论】:
以上是关于如何调试 EXC_BAD_ACCESS 错误的主要内容,如果未能解决你的问题,请参考以下文章
ARC 的 main() 中的 EXC_BAD_ACCESS 但没有提示错误
线程1:EXC_BAD_ACCESS (code=1) error c++ project