调试 EXC BAD ACCESS
EXC_BAD_ACCESS
表示进程尝试以无效方式访问内存,例如取消引用 NULL
指针或写入只读内存。这是最难的崩溃调试的,因为它通常没有错误消息,有些死机可能是非常难以复制和/或发生在代码完全无关的问题。这种错误在 Swift 中非常罕见,但如果发生这种情况,通常可以通过减少编译器优化来更容易地调试崩溃。
大多数 EXC_BAD_ACCESS
错误是由试图取消引用 NULL
指针引起的。如果是这种情况,红色箭头中列出的地址通常是十六进制数,低于正常的内存地址,通常是 0x0
。在调试器中设置断点或添加偶尔的 printf
/ NSLog
语句以找出该指针为 NULL
的原因。
发生不太可靠或完全没有意义的 EXC_BAD_ACCESS
可能是内存管理问题的结果。可能导致这种情况的常见问题是:
- 使用已解除分配的内存
- 试图写出 C 数组或其他类型缓冲区的结尾
- 使用尚未初始化的指针
在 Scheme Editor 的 Diagnostics 部分中,Xcode 包含一些有用的工具来帮助调试内存问题:
Address Sanitizer 添加了大量检查,可以在发生内存问题时停止应用程序,并提供有用的错误消息,详细说明发生的情况。Zombie Objects 检测到已释放的 Objective-C 对象存在问题,但你不应该在启用自动引用计数时遇到这些问题。