¿Cómo rastrear los lockings extraños de la aplicación iPad en el hilo AQClient?

Mi aplicación recientemente comenzó a mostrar crashs extraños, no puedo rastrear la fuente. Cualquier ayuda de qué search sería útil 🙂

Los loggings de locking del dispositivo (un iPad de iOS 5) muestran lo siguiente al principio:

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 

El subprocess AQClient 9 es un subprocess AQClient y su seguimiento de stack 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 de AVAudioPlayer o MPMoviePlayer. En la aplicación tengo una reproducción de películas (.m4v del package de la aplicación), cuando termina, la vista gira 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 no está previsto. Luego, al finalizar el audio (cuando el AVAudioPlayer debe ser desasignado), la aplicación se bloquea.

NSLog algunos NSLog s a la aplicación para rastrear lo que está sucediendo aquí. La console en el punto crítico me mostró algo así:

 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 

EDITAR:

La parte key aquí, creo, es los loggings duplicates al principio. Cuando no se cuelga, aparece solo una vez. Y, el problema podría provenir de llamar dos dealloc método dealloc del mismo object.

Diría que autorelease filtración de la agrupación autorelease y vea si el problema persiste.

Tuve un problema similar con una aplicación de iPhone que se ejecutaba en el simulador de iOS5. Al parecer, con esta configuration, si tiene un object autoelegido sin una agrupación autorelease definida, el sistema lanzará ese object inmediatamente e imprimirá ese post: "… Objeto 0x6872ed0 de la class TheClass autorelease sin grupo en el lugar – simplemente filtrándose – break on objc_autoreleaseNoPool () para depurar ". En mi código, estaba liberando el object incluso antes de la asignación de variables, por lo que se me garantizó que tenía mala memory después de esa línea. Para corregir, debe proporcionar un grupo de autorelease … puede include el código que asigna esos objects (en el nivel que sea apropiado) con @autoreleasepool {…}, por ejemplo:

 @autoreleasepool { NSData *data = [NSData dataWithBytes:myBytes length:myLength]; //do something with data } 

Al definir el grupo de autorelease con @autoreleasepool, mantendrá ese object de datos alnetworkingedor (no intentarlo y liberarlo) mientras usa ese object.

Otra solución sería asignar los objects que están siendo liberados utilizando un método que no utiliza autorelease. Lo sé con NSData, [datos NSData] devolverán un object autoelevado mientras que [[NSData alloc] init] no lo hará. Es probable que haya análogos con los objects que está utilizando. Obviamente, esto es solo una posibilidad si controlas la asignación … si no, es probable que te bloquees la definición de una agrupación autorelease.

Esto solo podría suceder en el simulador. He experimentado un problema similar que no pude solucionar, pero descubrí que sucede solo en un simulador, funciona bien en todos los dispositivos.