Cada vez que mi aplicación falla, Xcode resalta la llamada UIApicationMain () en la función main () como la línea que causó el bloqueo. En algunos casos, eso solía ser normal (error de segmentación, por ejemplo), pero el bloqueo con el que estoy tratando de lidiar es un simple SIGABRT 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 anteriores, pero desde que actualicé a Xocde 4.2 eso cambió. Es bastante obvio que Xcode sabe exactamente qué causó el bloqueo (o podría saberlo), pero aún no muestra la línea real. ¿Hay alguna solución o solución para esto?
objective-c
ios
xcode
cocoa-touch
nsexception
JonasG
fuente
fuente
Respuestas:
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]:
En el Navegador de proyectos en el lado izquierdo de Xcode, haga clic en el navegador del punto de interrupción (casi hasta el lado derecho de la barra de botones superior. El icono se ve como una gruesa flecha hacia la derecha).
En la parte inferior del navegador, haga clic en el botón "+".
Haga clic en "Agregar punto de interrupción de excepción".
Se creará un nuevo punto de interrupción. Debe configurarse según sea necesario, pero puede modificar su comportamiento.
Ejecute su proyecto y reproduzca la excepción.
También mencionó que se vinculó a algunas bibliotecas / marcos de terceros. Si la excepción se produce dentro de esos marcos, tendrá dificultades ya que el código se compila 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, debe presentar un informe de error a los encargados del mantenimiento de esas bibliotecas.
fuente
Simplemente siga las instrucciones en esta respuesta de StackOverflow:
Habilitar zombis
Básicamente, solo necesitas "Habilitar zombis". Entonces Xcode debería romperse en cualquier línea que haya causado el problema.
(Es absolutamente impactante que, incluso en 2017, Xcode todavía tenga esto desactivado de forma predeterminada. ¿Por qué no querría ver la línea que causó el problema? ¿Y " Habilitar objetos zombis "? ¡¿En serio?! ¿cree que este es un nombre útil, que tendría algún tipo de 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 ...)
fuente
Editar el esquema actual y habilitar
NSZombieEnabled
,MallocStackLogging
yguard malloc
. Luego, cuando su aplicación falla, escriba esto en la consola gdb:Reemplace
0x543216
con la dirección del objeto que causó elNSInvalidArgumentException
y debería darle un seguimiento de pila mucho más útil, mostrando las líneas de su código que están causando el bloqueo.fuente
He visto este comportamiento en código muy optimizado; comprobar, ajustar el nivel de optimización de su objetivo y los de las librerías de terceros puede ayudar. (Configuración del nivel de optimización de LLVM 3.0)
¿Estás generando símbolos de depuración?
fuente
Escribí código para generar un bloqueo de índice fuera del límite. A continuación se presenta la excepción.
Si lees atentamente
First Throw call stack
0 and 1
son los procesos del sistema después del bloqueo.2
es la línea que causó la excepción.3
le dice que el nombre de clase (ViewController
) y la función naem (ComplexFunction
) en la que se produjo la excepción.fuente