Molte volte, questi tipi di errori sono il risultato di una "tempesta perfetta" di circostanze (ad es. condizioni di gara, attività poco frequenti che si svolgono solo al "giusto" orario, ecc.), e spesso il tipo di circostanze che non si possono prevedere; se sapessi come riprodurlo in modo affidabile, probabilmente sapresti anche come risolverlo. La prossima cosa migliore che puoi sperare è provare ad aumentare le tue probabilità statistiche di riprodurlo in un ambiente (il debugger) dove potresti sperare di dare un senso a ciò che sta accadendo.
Vedere questo post: iOS Development: How can I induce low memory warnings on device?. Simulando programmaticamente gli avvisi di memoria, è possibile (ad esempio) utilizzare un timer ripetuto per causare un avviso di memoria di 1/sec (molto più veloce di quello e si potrebbero incappare in altri problemi, il che ti farà inseguire più che risolvere il tuo problema originale), eliminando la necessità di farlo ripetutamente a mano.
Prima effettivamente in esecuzione del test, è possibile anche impostare i punti di interruzione ai seguenti posizioni:
Symbol Module
====== ======
objc_exception_throw libobjc.A.dylib
-[NSException raise] CoreFoundation
Inoltre, impostare punti di interruzione su tutte le eccezioni Objective-C. L'impostazione di un punto di interruzione consente di ispezionare il contenuto della memoria prima che l'eccezione venga effettivamente generata dal runtime, che offre una possibilità molto migliore di comprendere il problema quando si verifica. Quando (e se) acquisisci l'incidente, controlla pid
, pid.UTF8String
e sql_stmt
, in quanto sembrano i colpevoli più probabili.
Esegui la tua app e avvia il timer. Questo non sarà necessariamente o direttamente causa l'incidente che stai cercando, ma probabilmente renderà molto più probabile che si verifichi nel tempo senza doverlo tenere in mano; puoi spegnere il timer e attendere (ad esempio, fare qualcosa di più produttivo) finché non vedi effettivamente l'incidente.
Da quello che ho capito, l'opzione genera solo un avviso e chiama un metodo come "didReceiveMemoryWarning", ma riproduce anche lo stesso comportamento di un dispositivo con poca memoria? – heitortsergent
sì. http://stackoverflow.com/a/5892435/2574577 –
grazie per il link @MaxvonHippel! Ho provato a utilizzare questa opzione e ho aggiornato la domanda, ma non riesco ancora a riprodurre l'errore EXC_BAD_ACCESS – heitortsergent