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...)ます。

上記の 2 行に注意してください。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 のメモリを表示」しようとすると、完全に空のメモリ ビューが表示されます。

変数は強力な @property として保存されます。lineBeginningsこれは、アプリ デリゲートの init メソッドで作成された可変インデックス セットであり、アプリの実行中に削除されることはありません。それに書き込むバックグラウンド操作キューがありますが、dispatch_sync(dispatch_get_main_queue()).

これをさらにデバッグする方法がわかりませんか?再現するのは難しいです。最大 1 分間ウィンドウのサイズを変更する必要があります (これにより、バックグラウンド キューで lineBeginnings 変数が再作成されます。このプロセスには、180 MB のデータが与えられた場合に約 5 分かかります)。このクラッシュが発生します。

バッファオーバーランか何かのように見えますか?どうすればそれを追跡できますか?

ファイルのソース コードは次のとおりです: https://gist.github.com/abhibeckert/7128740 (クラッシュは 254 行にあります)。

4

2 に答える 2

12

180 MB には、おそらく数百万の行頭がありますか? つまり、何百万もの 8 バイト ワードの配列をスタックに割り当てています。通常、スレッドのスタックはそれほど大きくありません。

を使用して、配列をヒープに割り当てる必要がありますmalloc

あなたの問題はスタックオーバーフローと呼ばれます。おなじみですね。

于 2013-10-24T00:09:53.657 に答える
0

私は同じ問題を抱えていました.2日間過ごした後、ゲッターでセルフを使用していたため、ゲッターが何度か呼び出していることがわかりました。

 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 に答える