Xcode no muestra la línea que causa un locking

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

*** 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 justo con SDK más antiguos, pero desde que pasé a Xocde 4.2 cambió. Es bastante obvio que Xcode sabe exactamente qué causó el fallo (o pudo saberlo), pero aún no muestra la línea real. ¿Hay alguna solución o solución para esto?

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

  1. En el Navegador de proyectos en el lado izquierdo de Xcode, click el browser de puntos de interrupción (casi todo el path hacia el lado derecho de la barra de botones superior. El ícono se parece a una flecha derecha gruesa).

  2. En la parte inferior del browser, click el button "+".

  3. Haga clic en "Agregar punto de interrupción de exception".

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

  5. Ejecute su proyecto y reproduzca la exception.

También mencionaste que estás vinculado a algunas bibliotecas / frameworks de terceros. Si la exception está ocurriendo dentro de esos frameworks, entonces va a tener dificultades ya que el código se comstack y Xcode no puede mostrarle la línea que causó la exception. 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:

Habilita a los zombis

Básicamente, solo necesitas "Habilitar a los zombis". Luego, Xcode debe romperse en cualquier línea que haya causado el problema.

introduzca la descripción de la imagen aquí

(Es absolutamente sorprendente que, incluso en 2017, Xcode todavía tenga esta opción desactivada de forma pnetworkingeterminada. ¿Por qué no quieres ver la línea que causó el problema? ¿Y " Habilitar objects zombi "? ¡Realmente! ¡Realmente los autores de Xcode! ¿cree que este es un nombre útil, que tendría sentido para los nuevos desarrolladores? Es deprimente cuán pobre es la calificación de Xcode, año tras año, en la App Store. Nadie está escuchando …)

Edite el esquema actual y active NSZombieEnabled , MallocStackLogging y guard malloc . Entonces, cuando su aplicación se bloquea, escriba esto en la console gdb:

 (gdb) info malloc-history 0x543216 

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

He visto este comportamiento en un código muy optimizado; comprobar, ajustar el nivel de optimization de su objective y los de libs de terceros pueden ayudar. (Configuración de nivel de optimization LLVM 3.0)

¿Estás generando símbolos de debugging?

Escribí código para generar un locking del índice fuera de límite. A continuación se presenta la exception.

 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 _runAfterCACommitDefernetworkingBlocks + 653 12 UIKit 0x000000010ec7a273 _cleanUpAfterCAFlushAndRunDefernetworkingBlocks + 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 atención la First Throw call stack

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

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

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

2 es la línea que causó la exception.

 3 testABC 0x000000010dce962d -[ViewController ComplexFunction] + 61 

3 le dice que nombre de class ( ViewController ) y function naem ( ComplexFunction ) en el que se lanzó la exception.