2017-02-15 48 views
3

我在生产应用程序中发现了一些奇怪的coredata错误,并且我能够获得崩溃报告。Coredata在提取时崩溃

及其在倍以下消息崩溃

***误差对象0x17e400000:释放未分配指针

***误差对象0x17fd03730:被重新分配指针没有被分配

这里是堆栈跟踪

Crashed: SQLQueue 0x13ff15250 for datastore.sqlite 
SIGABRT ABORT 0x0000000183986014 

0 libsystem_kernel.dylib __pthread_kill + 8 
1 libsystem_pthread.dylib pthread_kill + 112 
2 libsystem_c.dylib abort + 140 
3 libsystem_malloc.dylib _nano_vet_and_size_of_live + 330 
4 libsystem_malloc.dylib nano_free + 220 
5 libsqlite3.dylib sqlite3_finalize + 244 
6 CoreData -[NSSQLiteConnection _finalizeStatement] + 100 
7 CoreData -[NSSQLiteConnection releaseSQLStatement] + 52 
8 CoreData newFetchedRowsForFetchPlan_MT + 2420 
9 CoreData _executeFetchRequest + 72 
10 CoreData -[NSSQLFetchRequestContext executeRequestUsingConnection:] + 60 
11 CoreData __52-[NSSQLDefaultConnectionManager handleStoreRequest:]_block_invoke + 260 
12 libdispatch.dylib _dispatch_client_callout + 16 
13 libdispatch.dylib _dispatch_barrier_sync_f_invoke + 84 
14 CoreData -[NSSQLDefaultConnectionManager handleStoreRequest:] + 208 
15 CoreData -[NSSQLCoreDispatchManager routeStoreRequest:] + 288 
16 CoreData -[NSSQLCore dispatchRequest:withRetries:] + 200 
17 CoreData -[NSSQLCore processFetchRequest:inContext:] + 108 
18 CoreData -[NSSQLCore executeRequest:withContext:error:] + 504 
19 CoreData __65-[NSPersistentStoreCoordinator executeRequest:withContext:error:]_block_invoke + 4512 
20 CoreData -[NSPersistentStoreCoordinator _routeHeavyweightBlock:] + 276 
21 CoreData -[NSPersistentStoreCoordinator executeRequest:withContext:error:] + 408 
22 CoreData -[NSManagedObjectContext executeFetchRequest:error:] + 572 
23 CoreData -[NSManagedObjectContext(_NestedContextSupport) _parentObjectsForFetchRequest:inContext:error:] + 456 
24 CoreData __82-[NSManagedObjectContext(_NestedContextSupport) executeRequest:withContext:error:]_block_invoke + 584 
25 CoreData internalBlockToNSManagedObjectContextPerform + 92 
26 libdispatch.dylib _dispatch_client_callout + 16 
27 libdispatch.dylib _dispatch_barrier_sync_f_invoke + 84 
28 CoreData _perform + 232 
29 CoreData -[NSManagedObjectContext(_NestedContextSupport) executeRequest:withContext:error:] + 188 
30 CoreData -[NSManagedObjectContext executeFetchRequest:error:] + 572 
31 *MY_APP* NSManagedObject+MagicalRecord.m line 50__67+[NSManagedObject(MagicalRecord) MR_executeFetchRequest:inContext:]_block_invoke 

它确实发生在主线程上,我对如何调试这个问题感到困惑。看起来像一个内存问题,但。同时使用乐器时,它会在应用程序中显示NSPrivateQueueConcurrencyType的某些泄漏。

寻找一些启示它的见解。

应用程序广泛使用MagicalRecord,这里是导致上述崩溃的应用程序中的代码块。它只是从主线正常获取。最有趣的是它随机崩溃,即它不总是崩溃,但有时在执行Fetch时崩溃。

NSPredicate *filterPredicate = [NSPredicate predicateWithFormat:@"code == %@ and pid == %@", aCode,pid]; 
Permission *aPermission = [Permission MR_findFirstWithPredicate:filterPredicate]; 
+0

也粘贴一些代码。 – kb920

+0

@Sj这可能帮助 - :http://stackoverflow.com/questions/15253966/getting-the-error-pointer-being-freed-was-not-allocated-set-a-breakpoint-in –

+0

如果你可以共享一些'fetchRequest'和'object updates'相关的代码 – ystack

回答

0

睿最新managedObjectContext和managedObjects不是线程安全的 - 既不是写作或阅读。如果您违反此规则,核心日期可能随时崩溃 - 不一定违规发生的地点/时间。因此,即使您在主线程中访问为主线程设计的上下文,如果您在应用程序中的其他位置执行了错误操作,它仍然可能会崩溃。

3

访问(写或读)上比管理对象语境队列导致不确定的行为&其他任何线程管理对象的导致随机怪异崩溃。
看起来您的Managed Object Context创建时使用NSPrivateQueueConcurrencyType &您在Main Queue上执行fetch。这是奇怪的崩溃的来源。
您可以初始化MOCNSMainQueueConcurrencyType或嵌套所有fetchRequests[MOC performBlock:{...}]

相关问题