Objective-C 奇怪的 EXC_BAD_ACCESS

标签 objective-c cocoa crash

我的代码因 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 的内存”给出了一个完全空的内存 View 。

lineBeginnings 变量存储为一个强@property,它是一个在应用程序委托(delegate)的 init 方法中创建的可变索引集,并且在应用程序运行时永远不会被删除。有一个写入它的后台操作队列,但它使用 dispatch_sync(dispatch_get_main_queue()) 切换到主线程进行所有修改。

我不确定如何进一步调试它?很难重现,我必须调整窗口大小最多一分钟(这会导致在后台队列上重新创建 lineBeginnings 变量,这个过程在给定 180MB 数据时需要大约 5 分钟),以便发生此崩溃。

在我看来像是缓冲区溢出之类的?我如何追踪它?

文件的源代码在这里:https://gist.github.com/abhibeckert/7128740 (崩溃在第 254 行)。

最佳答案

在 180 MB 中可能有数百万行开头?因此,您正在 堆栈 上分配一个包含数百万个八字节字的数组。线程的堆栈通常不会那么大。

您应该使用 malloc 在堆上分配数组。

您的问题称为堆栈溢出。听起来很熟悉?

关于Objective-C 奇怪的 EXC_BAD_ACCESS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19554322/

相关文章:

objective-c - 如何在 NSUserDefaults 中存储带有 block 变量的自定义对象

javascript - 如何模拟对 div 的点击,然后以编程方式在 webview 中触发 onclick 事件?

macos - 从 Interface Builder 中的表头中删除排序顺序?

delphi - 新的自定义组件导致 IDE 崩溃

android - 在 Spinner 上选择/滚动项目时应用程序崩溃。 (LG 移动) (java.lang.IllegalStateException : Iteration already started)

objective-c - OSX - 从缩放按钮禁用全屏模式?

ios - 必须为标识符注册一个 nib 或一个类或连接一个原型(prototype)单元

iphone - 对象死后的生命(保留计数 = 0)

objective-c - NSTableView,多个单元格和绑定(bind)

c - 如何在 Linux 上检查进程的堆大小