Mi aplicación recientemente comenzó a mostrar bloqueos extraños que no puedo rastrear hasta la fuente. Cualquier ayuda de lo que debe buscar sería de gran ayuda :)Cómo rastrear extraños bloqueos de la aplicación del iPad en el hilo AQClient?
registros de errores desde el dispositivo (un iOS 5 iPad) muestra el siguiente material al comienzo:
Date/Time: 2011-11-08 19:07:21.044 +0100
OS Version: iPhone OS 5.0 (9A334)
Report Version: 104
Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x406cad3d
Crashed Thread: 9
La estrellado rosca 9 es un hilo AQClient
y su seguimiento de la pila se ve así:
Thread 9 name: AQClient
Thread 9 Crashed:
0 libobjc.A.dylib 0x30107fbc objc_msgSend + 16
1 AVFoundation 0x3420cdc8 _ZL27AudioPlayerAQOutputCallbackPvP16OpaqueAudioQueueP16AudioQueueBuffer + 28
2 AudioToolbox 0x32a409fe ClientMessageHandler::OutputBufferComplete(unsigned int) + 98
3 AudioToolbox 0x32a425d6 AQClientCallbackMessageReader::DispatchCallbacks(unsigned char*, unsigned int, void*, unsigned int) + 198
4 AudioToolbox 0x32a408dc AQCallbackReceiver_CallbackNotificationsAvailable + 364
5 AudioToolbox 0x329ee4b6 _XCallbackNotificationsAvailable + 54
6 AudioToolbox 0x329e436c mshMIGPerform + 368
7 CoreFoundation 0x34fa454c __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 32
8 CoreFoundation 0x34fa44ee __CFRunLoopDoSource1 + 134
9 CoreFoundation 0x34fa333c __CFRunLoopRun + 1364
10 CoreFoundation 0x34f264d6 CFRunLoopRunSpecific + 294
11 CoreFoundation 0x34f2639e CFRunLoopRunInMode + 98
12 AudioToolbox 0x32a3d29c GenericRunLoopThread::Entry(void*) + 116
13 AudioToolbox 0x329c5aac CAPThread::Entry(CAPThread*) + 208
14 libsystem_c.dylib 0x35756c16 _pthread_start + 314
15 libsystem_c.dylib 0x35756ad0 thread_start + 0
esto parece estar relacionado con la actividad o AVAudioPlayer MPMoviePlayer. En la aplicación, tengo una película en reproducción (.m4v desde el paquete de la aplicación), y cuando termina, la vista se vuelve hacia un lado sin la película y el audio comienza a reproducirse.
En el caso de fallas, lo que puedo escuchar es el mismo audio que se reproduce dos veces, incluso si no fue intencionado. Luego, al finalizar el audio (cuando el AVAudioPlayer debe ser desasignado), la aplicación se bloquea.
He añadido algunos NSLog
s a la aplicación para rastrear lo que está sucediendo aquí. La consola en el punto crítico me mostró tal cosa:
Nov 8 19:17:19 unknown XXX[1753] <Warning>: Finished movie
Nov 8 19:17:19 unknown XXX[1753] <Warning>: Finished movie
Nov 8 19:17:20 unknown XXX[1753] <Warning>: flipping
Nov 8 19:17:20 unknown XXX[1753] <Warning>: flipping
Nov 8 19:17:20 unknown XXX[1753] <Warning>: --> dealloc <AVAudioPlayer: 0x6887530> (d2_s3_l3_q9.aif)
Nov 8 19:17:20 unknown XXX[1753] <Warning>: --> dealloc <AVAudioPlayer: 0x6887530> (d2_s3_l3_q9.aif)
Nov 8 19:17:20 unknown UIKitApplication:com.bundle.name[0x2432][1753] <Notice>: objc[1753]: Object 0x68859f0 of class __NSCFString autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug
Nov 8 19:17:20 unknown UIKitApplication:com.bundle.name[0x2432][1753] <Notice>: objc[1753]: Object 0x11ef30 of class __NSCFString autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug
Nov 8 19:17:20 unknown UIKitApplication:com.bundle.name[0x2432][1753] <Notice>: objc[1753]: Object 0x1a6720 of class __NSCFString autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug
Nov 8 19:17:20 unknown UIKitApplication:com.bundle.name[0x2432][1753] <Notice>: objc[1753]: Object 0x6872400 of class __NSCFString autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug
(...)
Nov 8 19:17:20 unknown UIKitApplication:com.bundle.name[0x2432][1753] <Notice>: objc[1753]: Object 0x6872ed0 of class __NSCFDictionary autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug
Nov 8 19:17:20 unknown UIKitApplication:com.bundle.name[0x2432][1753] <Notice>: objc[1753]: Object 0x10cf80 of class __NSCFNumber autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug
Nov 8 19:17:20 unknown UIKitApplication:com.bundle.name[0x2432][1753] <Notice>: objc[1753]: Object 0x6850480 of class __NSCFString autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug
Nov 8 19:17:20 unknown UIKitApplication:com.bundle.name[0x2432][1753] <Notice>: objc[1753]: Object 0x10a530 of class __NSCFNumber autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug
Nov 8 19:17:20 unknown UIKitApplication:com.bundle.name[0x2432][1753] <Notice>: objc[1753]: Object 0x1d15d0 of class __NSCFNumber autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug
Nov 8 19:17:20 unknown UIKitApplication:com.bundle.name[0x2432][1753] <Notice>: objc[1753]: Object 0x6884550 of class TFCrashHandler autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug
Nov 8 19:17:20 unknown UIKitApplication:com.bundle.name[0x2432][1753] <Notice>: objc[1753]: Object 0x685ec10 of class __NSCFString autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug
Nov 8 19:17:20 unknown UIKitApplication:com.bundle.name[0x2432][1753] <Notice>: objc[1753]: Object 0x6856270 of class __NSCFDictionary autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug
Nov 8 19:17:21 unknown com.apple.networkd[1763] <Notice>: main:212 networkd.1763 built Sep 16 2011 00:02:59
Nov 8 19:17:25 unknown ReportCrash[1764] <Notice>: Formulating crash report for process XXX[1753]
Nov 8 19:17:25 unknown com.apple.launchd[1] <Warning>: (UIKitApplication:com.bundle.name[0x2432]) Job appears to have crashed: Segmentation fault: 11
Nov 8 19:17:25 unknown SpringBoard[15] <Warning>: Application 'XXX' exited abnormally with signal 11: Segmentation fault: 11
Nov 8 19:17:25 unknown ReportCrash[1764] <Error>: Saved crashreport to /var/mobile/Library/Logs/CrashReporter/XXX_2011-11-08-191724_iKotapad.plist using uid: 0 gid: 0, synthetic_euid: 501 egid: 0
EDIT:
La parte clave aquí, creo, es los registros se duplicó al principio. Cuando no se bloquea, aparece una sola vez. Y, el problema podría provenir de llamar dos veces al método dealloc
del mismo objeto.
Esto parece ser un problema con el grupo de autorrelease en el hilo no principal, y como no hago ninguna tarea de multiproceso en esta aplicación y no uso tareas en segundo plano, creo que puede ser un problema en mi código... – kender
Me pregunto si esto podría estar relacionado con el uso de propiedades no atómicas en mi código. Tal vez esto podría haber causado el acceso duplicado a la variable? – kender
La consola parece indicar que el código que inicia el audio se está ejecutando dos veces, pero hace referencia al mismo objeto, que funciona muy bien hasta que llega el momento de desasignarlo. Comente uno de los lugares donde está comenzando el audio, incluso si cree que es el único lugar, y vea si recibe dos llamadas. Es posible que el evento que se desencadena al final de la película se llame dos veces y el audio comience dos veces como resultado: intente agregar un indicador booleano para asegurarse de que la rutina de inicio de audio solo se ejecute una vez. – Tim