単体テスト中に Core Data スレッドで例外がスローされ、次のメッセージが表示されます。
CoreData: エラー: 重大なアプリケーション エラーです。コア データの変更処理中に例外がキャッチされました。これは通常、NSManagedObjectContextObjectsDidChangeNotification のオブザーバー内のバグです。-[__NSCFSet addObject:]: userInfo (null) で nil を挿入しようとしました
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFSet addObject:]: attempt to insert nil'
*** First throw call stack:
(
0 CoreFoundation 0x00683a14 __exceptionPreprocess + 180
1 libobjc.A.dylib 0x02334e02 objc_exception_throw + 50
2 CoreFoundation 0x0068393d +[NSException raise:format:] + 141
3 CoreFoundation 0x005595b9 -[__NSCFSet addObject:] + 185
4 CoreData 0x001d47c0 -[NSManagedObjectContext(_NSInternalChangeProcessing) _processPendingInsertions:withDeletions:withUpdates:] + 560
5 CoreData 0x001cee8a -[NSManagedObjectContext(_NSInternalChangeProcessing) _processRecentChanges:] + 2410
6 CoreData 0x001ce506 -[NSManagedObjectContext processPendingChanges] + 54
7 CoreData 0x001f359b developerSubmittedBlockToNSManagedObjectContextPerform + 443
原因を特定しようとしていますが、NSManagedObjectContext
キューで発生しているため、スレッドには独自のコードのスタック トレースがありません。
-[__NSCFSet addObject:]
とにシンボリック ブレークポイントを設定しまし-[NSManagedObjectContext processPendingChanges]
たが、そこで停止している間は状態を確認できず、どのオブジェクトが問題を引き起こしているかを判断するのに役立ちました。
私が思いついた次のステップは、swizzling を試し-[__NSCFSet addObject:]
て独自の実装を追加することでした。これにより、引数が nil の場合にのみ停止できました。セットが空でないことを願っています。nil を挿入する前にその内容を確認することで、より多くの情報を取得できます。ただし、プライベートクラスなので、スウィズルするのに苦労しました。
上記のアプローチ、または私が考えていなかったアプローチを使用して、例外の原因に関する詳細情報を取得するにはどうすればよいですか?