我的代码因 EXC_BAD_ACCESS 错误而崩溃,我不知道如何调试。
这是代码:
NSUInteger lineCount = self.lineBeginnings.count;
NSUInteger lineBeginnings[lineCount];
[self.lineBeginnings getIndexes:lineBeginnings maxCount:lineCount inIndexRange:nil];
它在最后一行崩溃,带有EXC_BAD_ACCESS (code=2, address=0x...)
.
注意上面的两行,它能够完美地读取 self.lineBeginnings,但是在调试器中我得到:
(lldb) p [self lineBeginnings]
error: Trying to put the stack in unreadable memory at: 0x7fff5d15e310.
(lldb) p _lineBeginnings
(NSMutableIndexSet *) $1 = 0x0000610000059b90
(lldb) po _lineBeginnings
[no Objective-C description available]
lineBeginnings 也没有在 GUI 范围浏览器中正确显示(所有其他变量都会显示),并且尝试“查看 lineBeginnings 的内存”会给出一个完全空的内存视图。
该lineBeginnings
变量存储为强 @property,它是在应用程序委托的 init 方法中创建的可变索引集,并且在应用程序运行时从不删除。有一个后台操作队列写入它,但它会切换到主线程进行所有修改,使用dispatch_sync(dispatch_get_main_queue())
.
我不确定如何进一步调试?很难重现,我必须调整窗口的大小长达一分钟(这会导致在后台队列中重新创建 lineBeginnings 变量,当给定 180MB 数据时,这个过程需要大约 5 分钟),以便发生这种崩溃。
它看起来像缓冲区溢出或对我来说是什么?我如何追踪它?
该文件的源代码在这里:https ://gist.github.com/abhibeckert/7128740 (崩溃在第 254 行)。