Xcode lanza una excepción en Main () en iOS 8 con el punto de corte ‘all exceptiontions’

Estoy usando Xcode 6 (GM, no descargué versiones beta), y estoy desarrollando aplicaciones para iOS 7+. Para todos mis proyectos, acabo de abrir los mismos proyectos en los que solía trabajar en Xcode 5.

En el navegador Breakpoint, tengo el punto de interrupción All Exceptions activado. Está configurado para Break: On Throw . Ahora, cada vez que ejecuto mi aplicación (ya sea en un dispositivo o en un simulador), detiene la ejecución en la línea return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); en la función main() .

Si presiono Reproducir para continuar la ejecución del progtwig dos veces, el progtwig funciona bien. Esto no me impide trabajar, pero es molesto tener que ejecutar la ejecución manualmente cada vez y restablecer mis editores.

Me gustan los comportamientos que configuré en Xcode (llevando el editor actual a donde se detuvo la ejecución), y tener ese punto de interrupción de All Exceptions es IMO importante. (Entonces no quiero cambiar eso)

Al ejecutar el mismo código, con los mismos entornos, para un objective iOS 7 (nuevamente, dispositivo o simulador), la excepción no se produce.

¿Alguna pista de lo que podría causar este extraño comportamiento?

Como se indica en los comentarios, debe desactivar la captura de las excepciones de C ++ editando su punto de interrupción Todas las excepciones .

Para hacer eso, haga clic derecho en su punto de interrupción y cambie Exception de All a Objective-C :

cambiar todo a Objective-C

Las excepciones en el código C ++ son parte de la funcionalidad normal de la aplicación. Sin embargo, el punto de interrupción de excepciones no se está atrapando, pero todas las excepciones aumentadas, incluso cuando se manejan correctamente más adelante, de ahí la detención en la ejecución.

TLDR; En mi caso, la causa del problema faltaba en las fonts.

Yo también tuve este problema. Mientras que @Johnnywho es correcto que dejar Exception Breakpoint solo para Objective-C, detiene el comportamiento no deseado, todavía no explica cuál es la causa real, por qué se ejecuta sin excepción en iOS7 y por qué esto ocurre solo en algunos proyectos.

Es por eso que seguí y diseccioné uno de mis proyectos en el que tuve este problema, hasta el punto en que pude encontrar la causa. Supongo que podría haber más de una causa para este comportamiento, pero en mi caso faltaban fonts personalizadas.

Forma rápida de probarlo:

  1. Comience un nuevo proyecto de vista única

  2. Habilitar punto de interrupción en todas las excepciones, incluido C ++ (puntos de interrupción / + / Agregar punto de interrupción de excepción)

  3. Arrastre al proyecto alguna fuente personalizada (permita copiar y verifique el destino para agregarlo)

  4. Agregar una etiqueta a la vista en el controlador de vista principal

  5. Elija la fuente personalizada para su etiqueta (en Xcode 6+ debe mostrarse en el selector de fonts tan pronto como lo arrastre al proyecto).

  6. Ejecute la aplicación y confirme que vea la etiqueta en su fuente personalizada (parece que ya no necesitamos agregar el nombre del archivo de fuente en Info.plist para la clave “Fuentes proporcionadas por la aplicación”, si la fuente personalizada ha sido utilizado en un guión gráfico de xib de la aplicación).

  7. Ahora elimine la fuente personalizada de su proyecto (desmarcando la relación del objective o eliminándola en la configuración de destino / Fases de comstackción / Copiar recursos del paquete)

  8. Elimine la aplicación de su dispositivo o SIM (para eliminar el archivo de fuente del paquete de la aplicación)

  9. Producto / Limpieza

  10. Ejecute la aplicación nuevamente (ahora la etiqueta todavía tiene la referencia a la fuente personalizada pero la aplicación no tiene el archivo para ella). Deberías notar la misteriosa excepción si corres en iOS8.

  11. Ejecute la aplicación en el dispositivo con iOS7 o sim con iOS7 (deberá cambiar el destino de implementación de iOS a iOS7 para eso). Aunque la etiqueta no mostrará la fuente personalizada, no habrá una excepción.

  12. Vuelva a agregar el archivo de la fuente al objective y el punto de interrupción ya no se detiene en la ejecución.

Así que mi conclusión es que en iOS8 las fonts que faltan causan la excepción de C ++, mientras que en iOS7 no, por lo tanto, el desencadenador del punto de interrupción.

La excepción similar (y el desencadenante de punto de interrupción) también pueden ser causados ​​por un nombre de archivo de fuente incorrectamente escrito en el archivo Info.plist bajo la clave “Fuentes proporcionadas por la aplicación”.

Solo resumí las respuestas anteriores que me ayudaron a solucionarlo.

Problema: cuando agrega una fuente personalizada y luego aparentemente la elimina (reemplaza), en algún lugar del proyecto sigue siendo su referencia y el punto de interrupción se detiene varias veces en el punto de interrupción principal de C ++ lib en iOS 8.

Soluciones

1) Buscar en el proyecto y eliminar (reemplazar) todas las referencias a esas fonts. Podría en algunas puntas, submódulos, etc.

2) Si no puede solucionarlo en todas partes (las librerías de solo lectura lo usan) o si el problema persiste después de la solución 1, vuelva a agregar esas fonts antiguas al proyecto

3) Ignorarlo – Es libre de C ++ así que cambie la excepción de punto de interrupción de “Todos” a “Objetivo-C” solamente

Xcode 9, a veces hay excepciones que se lanzan, pero iOS está atrapándolo con gracia. Esto ayudará

enter image description here

enter image description here

fuente

para mi caso, era un atributo definido por el usuario en punta

Tuve un problema similar, el problema fue que agregué algunos archivos de interfaz de otro proyecto que tiene una fuente diferente. Solo encuéntrelos y elimínelos.