FMDBBlockSQLiteCallBackFunction Falha no aplicativo que não está usando makeFunctionNamed

102

Estou trabalhando em um aplicativo que está na app store, que usa FMDBpara interagir com seu banco de dados sqlite. Recebemos alguns relatórios de falhas com rastreamentos de pilha 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

No entanto, pela leitura do FMDBcódigo, parece que FMDBBlockSQLiteCallBackFunctioné apenas chamado como retorno de chamada para SQLitefunções criadas usando FMDatabaseo makeFunctionNamed:maximumArguments:withBlock:método de, que não estamos usando de forma alguma.

Alguma ideia do que poderia estar causando travamentos como este?

Greg
fonte
Isso aconteceu depois de uma atualização de aplicativo ou depois que algo mais foi alterado ou simplesmente do nada?
Não, isso tem acontecido esporadicamente desde o lançamento. Não fomos capazes de reproduzir internamente, e apenas temos os relatórios de falhas para apresentar neste momento.
Greg
1
Esse didFinishsímbolo pode ser uma dica. Talvez você tenha uma espécie de condição de corrida. Ou seja, o hardware do desenvolvedor é executado mais rápido do que o hardware de alguns dos usuários, portanto, você não vê o problema ocorrer. Eu recomendo sobrecarregar seu hardware de alguma forma e ver se o problema aparece para você. Nesse caso, a depuração a partir daí deve ser fácil.
donjuedo
Acho que os símbolos no rastreamento da pilha podem estar incorretos. Acabei de encontrar uma falha em uma compilação de desenvolvimento do aplicativo que parece idêntica em termos de breadcrumbs que estou registrando com CLS_LOG, e era um caso de um delegado não relacionado ao FMDB não sendo definido como nulo no dealloc.
Greg
@Greg Mais alguma informação sobre isso? Estamos vendo o mesmo em um de nossos aplicativos. Você estava usando o ARC?
funkybro de

Respostas:

1

O didFinishfaz parecer que você pode ter uma condição de corrida nesta linha:

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

Tente emular um hardware lento para reproduzir o estado do usuário final.

Kirk Strobeck
fonte