Objective-C奇怪的EXC_BAD_ACCESS

Abh*_*ert 7 crash cocoa objective-c

我的代码崩溃了EXC_BAD_ACCESS错误,我不知道如何调试.

这是代码:

NSUInteger lineCount = self.lineBeginnings.count;
NSUInteger lineBeginnings[lineCount];
[self.lineBeginnings getIndexes:lineBeginnings maxCount:lineCount inIndexRange:nil];
Run Code Online (Sandbox Code Playgroud)

它在最后一行崩溃了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]
Run Code Online (Sandbox Code Playgroud)

此外,lineBeginnings在GUI范围浏览器中没有正确显示(所有其他变量都可以)并且尝试"查看lineBeginnings"会给出一个完全空的内存视图.

lineBeginnings变量存储为一个强大的@财产,它在应用程序委托的init方法创建和应用程序运行时,切勿取出一个可变的指标集.有一个后台操作队列写入它,但它切换到主线程用于所有修改使用dispatch_sync(dispatch_get_main_queue()).

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

它看起来像缓冲区溢出或对我来说什么?如何追踪它?

该文件的源代码如下:https://gist.github.com/abhibeckert/7128740(崩溃在第254行).

Nik*_*uhe 12

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

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

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