FMDBBlockSQLiteCallBackFunction Crash en la aplicación que no usa makeFunctionNamed

102

Estoy trabajando en una aplicación que está en la tienda de aplicaciones, que se usa FMDBpara interactuar con su base de datos sqlite. Hemos recibido algunos informes de fallos con seguimientos de pila como este:

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

Sin embargo, al leer el FMDBcódigo, parece que FMDBBlockSQLiteCallBackFunctionsolo se llama como devolución de llamada para las SQLitefunciones creadas con FMDatabaseel makeFunctionNamed:maximumArguments:withBlock:método de, que no estamos usando en absoluto.

¿Alguna idea de qué podría estar causando accidentes como este?

Greg
fuente
¿Sucedió esto después de una actualización de la aplicación o después de que se cambió algo más o simplemente de la nada?
No, esto ha estado sucediendo esporádicamente desde el lanzamiento. No hemos podido reproducirlo en casa, y solo tenemos los informes de fallas en este momento.
Greg
1
Ese didFinishsímbolo puede ser una pista. Quizás tengas una especie de condición de carrera. Es decir, el hardware de su desarrollador se ejecuta más rápido que el hardware de algunos de sus usuarios, por lo que no verá que se produce el problema. Recomiendo atascar su hardware de alguna manera y ver si el problema aparece para usted. Si es así, la depuración desde allí debería ser fácil.
donjuedo
Creo que los símbolos en el seguimiento de la pila pueden ser incorrectos. Me acabo de encontrar con un bloqueo en una compilación de desarrollo de la aplicación que se ve idéntica en términos de las rutas de navegación que estoy registrando con CLS_LOG, y fue un caso de un delegado de FMDB no relacionado con el valor nulo en dealloc.
Greg
@Greg ¿Más información sobre esto? Vemos lo mismo en una de nuestras aplicaciones. ¿Estabas usando ARC?
funkybro

Respuestas:

1

Los didFinishhace que parezca que pueden tener una condición de carrera en esta línea:

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

Intente emular hardware lento para reproducir el estado del usuario final.

Kirk Strobeck
fuente