No se puede encontrar un error que provoque un locking de "aserciones activas más allá del time permitido"

Obtengo el siguiente logging de locking que muestra que mi aplicación tiene "aserciones activas más allá del time permitido". Mi aplicación es una aplicación de transmisión de audio. El locking solo se produce cuando la aplicación está en segundo plano y NO se transmite ningún contenido de audio.

NOTAS:

  • Me aseguré de que beginBackgroundTaskWithExpirationHandler en applicationDidEnterBackground tenga un endBackgroundTask correspondiente en applicationWillEnterForeground.
  • Todos los accesos de networking están en su propio hilo y no en el hilo principal.
  • Cuando la aplicación está en segundo plano, no hay ningún bash por parte de ningún hilo para acceder a la networking.
  • El error es aleatorio y no se puede duplicar al cambiar de dispositivo al modo avión o al desactivar WiFi.

¿Alguna sugerencia sobre cómo rastrear esto?

Aquí está el logging de locking (sin imágenes binarias):

Incident Identifier: 0467A340-1FD2-4D49-9FA4-76360889976D CrashReporter Key: fdae46f133d13bdc3f043301bc008bd56155588d Hardware Model: iPhone3,1 Process: MyApp [249] Path: /var/mobile/Applications/DAA6B446-07D3-4C7C-BD44-80920338CAF4/MyApp/MyApp Identifier: MyApp Version: ??? (???) Code Type: ARM (Native) Parent Process: launchd [1] Date/Time: 2011-11-17 15:25:59.960 -0500 OS Version: iPhone OS 5.0.1 (9A405) Report Version: 104 Exception Type: 00000020 Exception Codes: 0x8badf00d Highlighted Thread: 4 Application Specific Information: MyApp[249] has active assertions beyond permitted time: {( <SBProcessAssertion: 0xfed8890> identifier: UIKitBackgroundCompletionTask process: MyApp[249] permittedBackgroundDuration: 600.000000 reason: finishTask owner pid:249 preventSuspend preventIdleSleep )} Elapsed total CPU time (seconds): 10.700 (user 10.700, system 0.000), 2% CPU Elapsed application CPU time (seconds): 0.024, 0% CPU Thread 0 name: Dispatch queue: com.apple.main-thread Thread 0: 0 libsystem_kernel.dylib 0x3630f010 0x3630e000 + 4112 1 libsystem_kernel.dylib 0x3630f206 0x3630e000 + 4614 2 CoreFoundation 0x343d841c 0x3434b000 + 578588 3 CoreFoundation 0x343d711a 0x3434b000 + 573722 4 CoreFoundation 0x3435a4d6 0x3434b000 + 62678 5 CoreFoundation 0x3435a39e 0x3434b000 + 62366 6 GraphicsServices 0x30bdefc6 0x30bdb000 + 16326 7 UIKit 0x377db73c 0x377aa000 + 202556 8 MyApp 0x000024de main (main.m:14) 9 MyApp 0x0000249c start + 32 Thread 1 name: Dispatch queue: com.apple.libdispatch-manager Thread 1: 0 libsystem_kernel.dylib 0x3630f3b4 0x3630e000 + 5044 1 libdispatch.dylib 0x37039e78 0x3702d000 + 52856 2 libdispatch.dylib 0x37039b96 0x3702d000 + 52118 Thread 2 name: WebThread Thread 2: 0 libsystem_kernel.dylib 0x3630f010 0x3630e000 + 4112 1 libsystem_kernel.dylib 0x3630f206 0x3630e000 + 4614 2 CoreFoundation 0x343d841c 0x3434b000 + 578588 3 CoreFoundation 0x343d7154 0x3434b000 + 573780 4 CoreFoundation 0x3435a4d6 0x3434b000 + 62678 5 CoreFoundation 0x3435a39e 0x3434b000 + 62366 6 WebCore 0x3682e128 0x36786000 + 688424 7 libsystem_c.dylib 0x331aac16 0x3319b000 + 64534 8 libsystem_c.dylib 0x331aaad0 0x3319b000 + 64208 Thread 3 name: com.apple.coremedia.player.async Thread 3: 0 libsystem_kernel.dylib 0x3631f068 0x3630e000 + 69736 1 libsystem_c.dylib 0x331aaf2e 0x3319b000 + 65326 2 libsystem_c.dylib 0x331aacaa 0x3319b000 + 64682 3 CoreMedia 0x32306000 0x32303000 + 12288 4 MediaToolbox 0x35169fba 0x35166000 + 16314 5 CoreMedia 0x32325bc6 0x32303000 + 142278 6 libsystem_c.dylib 0x331aac16 0x3319b000 + 64534 7 libsystem_c.dylib 0x331aaad0 0x3319b000 + 64208 Thread 4 name: com.apple.NSURLConnectionLoader Thread 4: 0 libsystem_kernel.dylib 0x3630f010 0x3630e000 + 4112 1 libsystem_kernel.dylib 0x3630f206 0x3630e000 + 4614 2 CoreFoundation 0x343d841c 0x3434b000 + 578588 3 CoreFoundation 0x343d7154 0x3434b000 + 573780 4 CoreFoundation 0x3435a4d6 0x3434b000 + 62678 5 CoreFoundation 0x3435a39e 0x3434b000 + 62366 6 Foundation 0x35d5abc2 0x35d4a000 + 68546 7 Foundation 0x35d5aa8a 0x35d4a000 + 68234 8 Foundation 0x35dee59a 0x35d4a000 + 673178 9 libsystem_c.dylib 0x331aac16 0x3319b000 + 64534 10 libsystem_c.dylib 0x331aaad0 0x3319b000 + 64208 Thread 5 name: com.apple.CFSocket.private Thread 5: 0 libsystem_kernel.dylib 0x3631f570 0x3630e000 + 71024 1 CoreFoundation 0x343dc66a 0x3434b000 + 595562 2 libsystem_c.dylib 0x331aac16 0x3319b000 + 64534 3 libsystem_c.dylib 0x331aaad0 0x3319b000 + 64208 Unknown thread crashed with unknown flavor: 5, state_count: 1 

beginBackgroundTaskWithExpirationHandler tiene un límite de time que puede estar excediendo. Puede ver cuánto time UIApplication con la propiedad backgroundTimeRemaining UIApplication .

No puede confiar en terminar su tarea de background cuando la aplicación regrese al primer plano a través de applicationWillEnterForeground (). iOS solo permite 3 minutos para realizar trabajos en segundo plano. Esta es la razón por la cual el método de inicio de tarea en segundo plano tiene un manejador de caducidad. Debe limpiar su tarea (muy rápidamente) y finalizar esa tarea (a través de endBackgroundTask) cuando se llama al controller de caducidad:

 UIBackgroundTaskIdentifier bkgndTask; --- bkgndTask = [app beginBackgroundTaskWithExpirationHandler:^{ if (bkgndTask != UIBackgroundTaskInvalid) { [[UIApplication shanetworkingApplication] bkgndTask]; bkgndTask = UIBackgroundTaskInvalid; } }];