我的代码由于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在堆上分配数组。

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

09-25 20:43