我的代码由于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
在堆上分配数组。
您的问题称为堆栈溢出。听起来很熟悉?