2017-04-13 17 views
1

RestKit에서 일관성없고 재현하기 어려운 충돌이 발생합니다. 충돌은 (here's the exact line of code) 안에있는 NSManagedObjectContext::save()에서 발생합니다.RKManagedObjectRequestOperation의 EXC_BREAKPOINT NSManagedObjectContext :: save

이 충돌은 프로덕션 환경에서 수십 명이 넘는 사용자에게 발생했지만 개인적으로 재현 할 수 없었습니다. 나는이 충돌을 야기 할 수있는 것에 관해서는 단서가 없다. 내 단서는 _forceRegisterLostFault이며 오류/삭제 된 개체가 관련되어 있음을 나타낼 수 있습니다.

배경 : RKManagedObjectRequestOperation::saveContextToPersistentStore:failedContext:error은 네트워크 요청 후 RestKit 매핑이 완료 될 때마다 호출됩니다.

이전에 CoreData에서이 특정 EXC_BREAKPOINT가 발생 했습니까? 이 문제를 해결하는 방법에 대한 제안이 있으십니까?

스택 추적 :

Crashed: NSManagedObjectContext 0x1741cf5a0 
0 CoreData      0x18add7c7c -[NSManagedObjectContext(_NSInternalAdditions) _forceRegisterLostFault:] + 160 
1 CoreData      0x18ad5c8b0 -[NSManagedObjectContext(_NSInternalAdditions) _validateObjects:forOperation:error:exhaustive:forSave:] + 2884 
2 CoreData      0x18ad5bcf8 -[NSManagedObjectContext(_NSInternalAdditions) _validateChangesForSave:] + 364 
3 CoreData      0x18ad5b94c -[NSManagedObjectContext(_NSInternalChangeProcessing) _prepareForPushChanges:] + 196 
4 CoreData      0x18ad51ec4 -[NSManagedObjectContext save:] + 544 
5 RestKit      0x1013214b8 __84-[RKManagedObjectRequestOperation saveContextToPersistentStore:failedContext:error:]_block_invoke (RKManagedObjectRequestOperation.m:800) 
6 CoreData      0x18add5b70 developerSubmittedBlockToNSManagedObjectContextPerform + 152 
7 libdispatch.dylib    0x1878e91c0 _dispatch_client_callout + 16 
8 libdispatch.dylib    0x1878f6860 _dispatch_barrier_sync_f_invoke + 84 
9 CoreData      0x18add5a80 -[NSManagedObjectContext performBlockAndWait:] + 308 
10 RestKit      0x1013212b8 -[RKManagedObjectRequestOperation saveContextToPersistentStore:failedContext:error:] (RKManagedObjectRequestOperation.m:808) 
11 RestKit      0x1013216d0 -[RKManagedObjectRequestOperation saveContext:error:] (RKManagedObjectRequestOperation.m:831) 
12 RestKit      0x101321f54 -[RKManagedObjectRequestOperation saveContext:] (RKManagedObjectRequestOperation.m:874) 
13 RestKit      0x10131f654 __79-[RKManagedObjectRequestOperation performMappingOnResponseWithCompletionBlock:]_block_invoke.350 (RKManagedObjectRequestOperation.m:660) 
14 RestKit      0x1013534a0 -[RKResponseMapperOperation willFinish] (RKResponseMapperOperation.m:323) 
15 RestKit      0x101353ac4 -[RKResponseMapperOperation main] (RKResponseMapperOperation.m:411) 
16 Foundation      0x1894578c4 -[__NSOperationInternal _start:] + 620 
17 Foundation      0x189524b00 __NSOQSchedule_f + 228 
18 libdispatch.dylib    0x1878e91c0 _dispatch_client_callout + 16 
19 libdispatch.dylib    0x1878f7444 _dispatch_queue_serial_drain + 928 
20 libdispatch.dylib    0x1878ec9a8 _dispatch_queue_invoke + 652 
21 libdispatch.dylib    0x1878f938c _dispatch_root_queue_drain + 572 
22 libdispatch.dylib    0x1878f90ec _dispatch_worker_thread3 + 124 
23 libsystem_pthread.dylib  0x187af22b8 _pthread_wqthread + 1288 
24 libsystem_pthread.dylib  0x187af1da4 start_wqthread + 4 

답변

0

나는이 에러를 본 적이 몇 가지 원인이 있습니다.

  • 잘못된 스레드에서 관리 대상 및/또는 컨텍스트에 액세스. Core Data Concurrency Debugging을 사용하여 항상 올바른 스레드 (-com.apple.CoreData.ConcurrencyDebug 1 인수)를 사용하고 있는지 확인하십시오.
  • 손상된 Sqlite 파일 - 응용 프로그램에 즉시 사용 가능한 코어 데이터 저장소가 포함되어 있습니까? 메타 데이터가 모두 올바른지 확인하십시오.
  • Overriding the default accessors을 핵심 데이터 관리 개체에 포함하십시오. 프리미티브 (int 또는 NSNumber 대신 float) 속성을 가진 객체가있는 경우주의해야합니다.
+0

'-com.apple.CoreData.ConcurrencyDebug 1'을 활성화하면 CoreData 동시성과 관련된 RestKit 내부의 여러 가지 충돌이 나타납니다. 나는 [여기] (https://github.com/RestKit/RestKit/issues/2502) 중 하나를 키웠다. 그것이 내가 경험하고있는 충돌과 함께 무엇인가해야하는지 명확히하지 않는다. 이러한 동시성 문제는 RestKit의 일부로 보입니다. – 100grams