FMDBBlockSQLiteCallBackFunction makeFunctionNamed를 사용하지 않는 앱의 충돌


102

FMDBsqlite 데이터베이스와 상호 작용 하는 데 사용하는 앱 스토어에있는 앱에서 작업 중입니다 . 다음과 같은 스택 추적이 포함 된 오류 보고서를 받았습니다.

Thread : Crashed: NSOperationQueue 0x170239c20 :: NSOperation 0x17024d7d0 (QOS: LEGACY)
0  libobjc.A.dylib                0x000000019701c0b4 objc_retain + 20
1  MyApp                          0x00000001002bdff4 FMDBBlockSQLiteCallBackFunction
2  MyApp                          0x00000001002bdb1c FMDBBlockSQLiteCallBackFunction
3  MyApp                          0x00000001002b66b4 FMDBBlockSQLiteCallBackFunction
4  MyApp                          0x00000001002980fc FMDBBlockSQLiteCallBackFunction
5  MyApp                          0x000000010029f20c FMDBBlockSQLiteCallBackFunction
6  CFNetwork                      0x00000001851475a4 __49-[__NSCFLocalSessionTask _task_onqueue_didFinish]_block_invoke + 300
7  Foundation                     0x00000001866bf1c4 __NSBLOCKOPERATION_IS_CALLING_OUT_TO_A_BLOCK__ + 16
8  Foundation                     0x0000000186610604 -[NSBlockOperation main] + 96
9  Foundation                     0x00000001866001cc -[__NSOperationInternal _start:] + 636
10 Foundation                     0x00000001866c1f28 __NSOQSchedule_f + 228
11 libdispatch.dylib              0x0000000197655954 _dispatch_client_callout + 16
12 libdispatch.dylib              0x00000001976600a4 _dispatch_queue_drain + 1448
13 libdispatch.dylib              0x0000000197658a5c _dispatch_queue_invoke + 132
14 libdispatch.dylib              0x0000000197662318 _dispatch_root_queue_drain + 720
15 libdispatch.dylib              0x0000000197663c4c _dispatch_worker_thread3 + 108
16 libsystem_pthread.dylib        0x000000019783522c _pthread_wqthread + 816

그러나 FMDB코드 를 읽어 보면 우리가 전혀 사용하지 않는 의 메서드를 사용하여 생성 된 함수에 FMDBBlockSQLiteCallBackFunction대한 콜백으로 만 호출됩니다 .SQLiteFMDatabasemakeFunctionNamed:maximumArguments:withBlock:

이와 같은 충돌을 일으킬 수있는 아이디어가 있습니까?


앱 업데이트 후 또는 다른 항목이 변경되거나 갑자기 갑자기 발생한 이후에 이런 일이 발생 했습니까?

아니요, 출시 이후 간헐적으로 발생했습니다. 우리는 사내에서 재현 할 수 없었고,이 시점에서는 충돌 보고서 만 제출할 수있었습니다.
Greg

1
didFinish기호는 힌트가 될 수 있습니다. 아마도 당신은 일종의 경쟁 조건을 가지고있을 것입니다. 즉, 개발자 하드웨어는 일부 사용자의 하드웨어보다 빠르게 실행되므로 문제가 발생하지 않습니다. 어떻게 든 하드웨어를 수렁에 빠뜨리고 문제가 나타나는지 확인하는 것이 좋습니다. 그렇다면 거기에서 디버깅이 쉬워야합니다.
donjuedo

스택 추적의 기호가 올바르지 않을 수 있다고 생각합니다. 방금 CLS_LOG로 로깅하는 이동 경로가 동일 해 보이는 앱의 개발 빌드에서 충돌이 발생했으며, FMDB 대리자가 dealloc에서 nil로 설정되지 않은 경우였습니다.
Greg

@Greg 이것에 대한 더 많은 정보가 있습니까? 우리는 우리 앱 중 하나에서 같은 것을보고 있습니다. ARC를 사용하고 계셨습니까?
funkybro

답변:


1

didFinish당신처럼 보이게은이 라인에 경쟁 조건이있을 수 있습니다 :

6  CFNetwork                      0x00000001851475a4 __49-[__NSCFLocalSessionTask _task_onqueue_didFinish]_block_invoke + 300

느린 하드웨어를 에뮬레이션하여 최종 사용자의 상태를 재현 해보십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.