Xcode no muestra la línea que causa un locking

Cada vez que mi aplicación falla, Xcode resalta la llamada UIApicationMain () en la función main () como la línea que provocó el locking. En algunos casos, eso solía ser normal (fallo de segmentación, por ejemplo), pero el locking con el que trato de tratar es un SIGABRT simple con información detallada registrada en la consola:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFDictionary setObject:forKey:]: attempt to insert nil value (key: Date)' 

Xcode solía mostrar la línea correcta con SDK más antiguos, pero desde que me actualicé a Xocde 4.2 eso cambió. Es bastante obvio que Xcode sabe exactamente qué causó el locking (o podría saber), pero aún no muestra la línea real. ¿Hay alguna solución o solución para esto?

También debe asegurarse de tener puntos de interrupción establecidos para todas las excepciones. Esto hará que Xcode se detenga en la línea donde se produce la excepción. Haga lo siguiente [en Xcode 4]:

  1. En Project Navigator en el lado izquierdo de Xcode, haga clic en el navegador de punto de interrupción (casi en su totalidad al lado derecho de la barra de botones superior. El icono se ve como una flecha hacia la derecha).

  2. En la parte inferior del navegador, haz clic en el botón “+”.

  3. Haga clic en “Agregar punto de interrupción de excepción”.

  4. Se creará un nuevo punto de interrupción. Se debe configurar según sea necesario, pero puede modificar su comportamiento.

  5. Ejecute su proyecto y reproduzca la excepción.

También mencionaste que vinculaste a bibliotecas / marcos de terceros. Si la excepción se produce dentro de esos marcos, entonces tendrá dificultades ya que el código está comstackdo y Xcode no puede mostrarle la línea que causó la excepción. Si este es el caso y está seguro de que está utilizando las bibliotecas correctamente, entonces debe presentar un informe de error a los mantenedores de esas bibliotecas.

Simplemente siga las instrucciones en esta respuesta de StackOverflow:

Habilitar Zombies

Básicamente, solo necesitas “Habilitar Zombies”. Entonces Xcode debería romperse en la línea que causó el problema.

enter image description here

(Es absolutamente impactante que, incluso en 2017, Xcode todavía tenga esta opción apagada por defecto. ¿Por qué no quieres ver la línea que causó el problema? ¿Y ” Habilitar objetos Zombie “?! ¿En serio? ¿Los autores de Xcode realmente ¿Cree que este es un nombre útil, que tendría algún sentido para los nuevos desarrolladores? Es deprimente lo pobre que es la clasificación de Xcode, año tras año, en la App Store. Nadie está escuchando …

Edite el esquema actual y habilite NSZombieEnabled , MallocStackLogging y guard malloc . Luego, cuando su aplicación falla, tipea esto en la consola de gdb:

 (gdb) info malloc-history 0x543216 

Reemplace 0x543216 con la dirección del objeto que causó la NSInvalidArgumentException y debería proporcionarle un seguimiento de stack mucho más útil, mostrando las líneas del código que están causando el locking.

He visto este comportamiento en código altamente optimizado; verificar, modificar el nivel de optimización de su objective y los de libs de terceros pueden ayudar. (Ajuste de nivel de optimización LLVM 3.0)

¿Estás generando símbolos de depuración?

Escribí código para generar un locking de índice fuera de límite. Lo siguiente es la excepción lanzada.

 2017-01-07 04:02:57.606 testABC[1694:52966] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSSingleObjectArrayI objectAtIndex:]: index 1 beyond bounds [0 .. 0]' *** First throw call stack: ( 0 CoreFoundation 0x000000010e85cd4b __exceptionPreprocess + 171 1 libobjc.A.dylib 0x000000010e2be21e objc_exception_throw + 48 2 CoreFoundation 0x000000010e8b5c2f -[__NSSingleObjectArrayI objectAtIndex:] + 111 3 testABC 0x000000010dce962d -[ViewController ComplexFunction] + 61 4 testABC 0x000000010dce95db -[ViewController thirdFunction] + 43 5 testABC 0x000000010dce959b -[ViewController secondFunction] + 43 6 testABC 0x000000010dce955b -[ViewController firstFinction] + 43 7 testABC 0x000000010dce96c2 -[ViewController viewDidAppear:] + 50 8 UIKit 0x000000010ee28a6c -[UIViewController _setViewAppearState:isAnimating:] + 945 9 UIKit 0x000000010ee2b7da __64-[UIViewController viewDidMoveToWindow:shouldAppearOrDisappear:]_block_invoke + 42 10 UIKit 0x000000010ee29ac4 -[UIViewController _executeAfterAppearanceBlock] + 86 11 UIKit 0x000000010ec8d77c _runAfterCACommitDeferredBlocks + 653 12 UIKit 0x000000010ec7a273 _cleanUpAfterCAFlushAndRunDeferredBlocks + 566 13 UIKit 0x000000010ec9d757 __84-[UIApplication _handleApplicationActivationWithScene:transitionContext:completion:]_block_invoke_2 + 194 14 CoreFoundation 0x000000010e8016ac __CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__ + 12 15 CoreFoundation 0x000000010e7e66f4 __CFRunLoopDoBlocks + 356 16 CoreFoundation 0x000000010e7e5e65 __CFRunLoopRun + 901 17 CoreFoundation 0x000000010e7e5884 CFRunLoopRunSpecific + 420 18 GraphicsServices 0x00000001126d9a6f GSEventRunModal + 161 19 UIKit 0x000000010ec80c68 UIApplicationMain + 159 20 testABC 0x000000010dce99df main + 111 21 libdyld.dylib 0x000000011174968d start + 1 22 ??? 0x0000000000000001 0x0 + 1 ) libc++abi.dylib: terminating with uncaught exception of type NSException 

Si lees con cuidado la First Throw call stack

 0 CoreFoundation 0x000000010e85cd4b __exceptionPreprocess + 171 1 libobjc.A.dylib 0x000000010e2be21e objc_exception_throw + 48 

0 and 1 son los procesos del sistema después del locking.

  2 CoreFoundation 0x000000010e8b5c2f -[__NSSingleObjectArrayI objectAtIndex:] + 111 

2 es la línea que causó la excepción.

 3 testABC 0x000000010dce962d -[ViewController ComplexFunction] + 61 

3 le dice que el nombre de la Clase ( ViewController ) y la función naem ( ComplexFunction ) en la cual se lanzó la excepción.