sqlite/coredataライブラリ内のiOS 10以降、ローカルで再現できないクラッシュを解決するために苦労しています。非常にまれに発生しています - 生産の0.2%の領域のどこかにあります。私が知っている(または少なくとも容疑者)は何iOS 10以降にコアデータがクラッシュする
:
- それは上記のみのiOS 10とで発生します。
- ほとんどの場合、コンテキストの保存中に発生しますが、コアデータフェッチ要求中にも発生している可能性があります。
- 非常にまれに発生する(セッションの野球率0.15%)
- xcodeメモリ管理ツールと並行してデバッグフラグを有効にしてストレステストを実行しました。問題は検出されませんでした。
- メモリリークのテスト済みです。
- 私はこのスタックトレースを開発環境で再現できませんでした。
- クラッシュする前に例外はスローされません。コード全体がラップされます。
- この操作はブロック内で実行され、アプリはフォアグラウンドにあります。
- 通常のアプリケーション操作中に一見ランダムに発生します。それはSIGABRTクラッシュ
libsystem_kernel.dylib0x00000001841c3014 __pthread_kill+4 libsystem_c.dylib0x0000000184137400 abort+136 libsystem_malloc.dylib0x0000000184207a5c nanozone_error+328 libsystem_malloc.dylib0x0000000184209028 nano_realloc+644 libsystem_malloc.dylib0x00000001841fb240 malloc_zone_realloc+176 libsqlite3.dylib0x0000000185730c34 sqlite3_value_text+1220 libsqlite3.dylib0x0000000185777f38 sqlite3_rekey+1564 libsqlite3.dylib0x000000018578df78 sqlite3_rekey+91740 libsqlite3.dylib0x0000000185791c88 sqlite3_rekey+107372 libsqlite3.dylib0x000000018571df98 sqlite3_log+86448 libsqlite3.dylib0x0000000185757780 sqlite3_bind_int+11992 libsqlite3.dylib0x00000001856f1c80 sqlite3_exec+35188 libsqlite3.dylib0x00000001856eb608 sqlite3_exec+8956 libsqlite3.dylib0x00000001856ea838 sqlite3_exec+5420 libsqlite3.dylib0x00000001856e9f24 sqlite3_exec+3096 libsqlite3.dylib0x00000001856e9ae0 sqlite3_exec+2004 CoreData0x00000001874f1284 -[NSSQLiteConnectionprepareSQLStatement:]+468 CoreData0x00000001876166f0 -[NSSQLiteConnectionupdateRow:forRequestContext:]+496 CoreData0x00000001876c3430 _writeChangesForSaveRequest+1596 CoreData0x00000001876c4958 _executeSaveChangesRequest+312 CoreData0x00000001876ba7f4 -[NSSQLSaveChangesRequestContextexecuteRequestUsingConnection:]+40 CoreData0x00000001875cdaf8 __52-[NSSQLDefaultConnectionManagerhandleStoreRequest:]_block_invoke+256 libdispatch.dylib0x000000018407e1bc _dispatch_client_callout+12 libdispatch.dylib0x000000018408b7f0 _dispatch_barrier_sync_f_invoke+80 CoreData0x00000001875cd994 -[NSSQLDefaultConnectionManagerhandleStoreRequest:]+204 CoreData0x0000000187693f80 -[NSSQLCoreDispatchManagerrouteStoreRequest:]+284 CoreData0x00000001875fb7e4 -[NSSQLCoredispatchRequest:withRetries:]+196 CoreData0x00000001875f7560 -[NSSQLCoreprocessSaveChanges:forContext:]+200 CoreData0x00000001874f8360 -[NSSQLCoreexecuteRequest:withContext:error:]+744 CoreData0x00000001875da2f4 __65-[NSPersistentStoreCoordinatorexecuteRequest:withContext:error:]_block_invoke+3248 CoreData0x00000001875d2bf0 -[NSPersistentStoreCoordinator_routeHeavyweightBlock:]+272 CoreData0x00000001874f7f20 -[NSPersistentStoreCoordinatorexecuteRequest:withContext:error:]+404 CoreData0x00000001875195ac -[NSManagedObjectContextsave:]+2768
は、ここでのコードは、一般的に次のようになります。です(未初期化時や何か特別なことで)
NSManagedObject *object = [[MyManagedObject alloc] init];
// This is actually within the init method
NSEntityDescription *desc = [NSEntityDescription entityForName:NSStringFromClass(object.class)
inManagedObjectContext:context];
[object initWithEntity:desc insertIntoManagedObjectContext:nil];
// later on...
[context performBlock:^{
// Fetch another (different) object from core data
NSArray *fetchResults = [context executeFetchRequest:request error:&error];
// Changing some properties of object with values from fetched results
object.property = fetchResults[0].property;
// insert the object
[context insertObject:object];
// save the context
[context save:&error]
}
任意のアイデアをいただければ幸いです。
更新:
私はいくつかの既存の問題(複数可)が露出させている可能性がiOSの10.2、と一致し、このリリースノートを発見しました。どのような変更があったのか、それがどのように問題を引き起こすのかははっきりしませんが、これは何とか関連しているようです。
https://support.apple.com/en-us/HT207422 影響:文字列の処理に存在していたメモリ破損の問題:悪質な文字列を処理すると、アプリケーションが予期せず終了したり、任意のコードが実行さ 説明につながる可能性があります。この問題は、改善された境界チェックによって対処されました。 CVE-2016-7663
コアデータコンテキストは、読み取りまたは書き込みのどちらのスレッドセーフでもありません。このコアに違反した場合、データはいつでも何らかの形で失敗する可能性があります。つまり、正しいスレッド上にあるコード内のポイントでもクラッシュレポートを診断するのは難しいかもしれません。あなたのコードでスレッドセーフの違反をチェックします。まず、managedObjectsをパラメータとして渡す関数を見てみましょう。 –
ありがとうございました。私は同時実行フラグ '-com.apple.CoreData.ConcurrencyDebug 1'を使ってアプリケーションをテストしていますが、最新のビルドでは何もフラグを立てていません。最初に並行処理の問題が疑われたので、コードを手作業でコーディングしました。残念ながら、このエラーはまだ発生しています。 – Kieran
ビルドのわずか0.5%で起こっている場合、コード行(または状況の組み合わせ)は非常にまれで、コードを実行することで見つけるのは難しいかもしれません。コードレビューでは、こうした問題を見つけるためにさらに多くのことを行うことがあります。 –