2011-11-08 12 views
5

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.

Respuesta

2

Yo diría que ocúpese de esa fuga de piscina autorelease primero y vea si el problema persiste.

+0

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

+0

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

+1

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

1

Tuve un problema similar con una aplicación de iPhone que se ejecuta en el simulador iOS5. Aparentemente, con esta configuración, si tiene un objeto liberado automáticamente sin un grupo de autorreleases definido, el sistema lo lanzará inmediatamente e imprimirá ese mensaje: "... Objeto 0x6872ed0 de la clase TheClass liberado automáticamente sin ningún grupo en su lugar, solo goteando - rompe en objc_autoreleaseNoPool() para depurar ". En mi código, estaba liberando el objeto incluso antes de la asignación de la variable, por lo que estaba garantizado que tenía mala memoria después de esa línea. Para solucionar, es necesario suministrar una piscina autorelease ... se puede envolver el código que asigna esos objetos (en cualquier nivel que sea apropiado) con @autoreleasepool {...}, por ejemplo:

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

Mediante la definición de la autorelease pool con @autoreleasepool, mantendrá ese objeto de datos (no lo intente y lo suelte) mientras usa ese objeto.

Otra solución sería asignar los objetos que se liberan utilizando un método que no utiliza liberación automática. Sé con NSData, [NSData data] devolverá un objeto liberado automáticamente mientras que [[NSData alloc] init] no lo hará. Es probable que haya analogías con los objetos que estás usando. Obviamente, esta es solo una posibilidad si controlas la asignación ... si no, probablemente estés atascado definiendo un grupo de autorrelease.

0

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

Cuestiones relacionadas