8

単体テスト中に 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 を挿入する前にその内容を確認することで、より多くの情報を取得できます。ただし、プライベートクラスなので、スウィズルするのに苦労しました。

上記のアプローチ、または私が考えていなかったアプローチを使用して、例外の原因に関する詳細情報を取得するにはどうすればよいですか?

4

3 に答える 3

14

-com.apple.CoreData.ConcurrencyDebug 1スキームに引数を追加することを提案してくれた@bteapotに感謝します。これがどのように機能するかについての詳細は、Ole Begemann の優れたCore Data Concurrency Debugging記事から入手できます。

NSManagedObjectContextこのフラグを追加すると、コードが正しくないスレッドから呼び出されるとすぐに例外がスローされます。これは Xcode ではうまく機能しますが、Xcode ボットでは、これによりテストが失敗し、次の役に立たないメッセージが表示されることに注意してください。

テスト マネージャー サービスへの接続が失われました

于 2016-01-15T19:29:13.613 に答える