7

我的代码因 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 行)。

4

2 回答 2

12

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

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

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

于 2013-10-24T00:09:53.657 回答
0

我遇到了同样的问题,花了 2 天后,我发现我的 getter 调用了几次,因为我在 getter 中使用了 self 。

 if(! _openSectionIndexes) _openSectionIndexes = [NSMutableArray new];

if( _openSectionIndexes.count != _requests.count)
{
    for (int i =0; i < _requests.count; i++)
    {
        [self.openSectionIndexes addObject: @(NO)];// here was the problem, replaced it with _openSectionIndexes
    }
}

return _openSectionIndexes;
于 2015-10-22T06:40:51.017 回答