Articles

Cómo Resolver el Error de SIGABRT en Xcode

Escrito por Reinder de Vries el 6 de agosto de 2020 en Desarrollo de aplicaciones, iOS

Cómo Resolver el error de SIGABRT en Xcode

En un minuto, su aplicación para iOS se ejecuta bien en Xcode, y al siguiente se ha bloqueado error SIGABRT críptico. ¡Qué está pasando!?

En este tutorial aprenderás:

  • Cómo resolver el error «SIGABRT de señal» en Xcode
  • Cómo usar algunas de las herramientas de depuración en Xcode
  • Qué significa SIGABRT y cuáles son sus causas
  • 3 enfoques para encontrar la causa raíz de SIGABRT

¿Listo? Vamos.

  1. ¿Qué Significa «Hilo 1: SIGABRT de señal»?
  2. Compruebe Sus Enchufes
  3. Compruebe La Trayectoria de la pila
  4. Haga un Punto de Interrupción de Excepción
  5. Lectura adicional

¿Qué Significa» Hilo 1: SIGABRT de señal»?

El SIGABRT de error significa «interrupción de señal». Es una señal que envía iOS, el sistema operativo, a una aplicación en ejecución, que la cierra de inmediato debido a un error de tiempo de ejecución. Esencialmente significa que su aplicación se ha bloqueado

Así es como se ve en Xcode:

Ejemplo de SIGABRT en Xcode

En la captura de pantalla, verá algunas cosas:

  • A la izquierda, verá una lista de hilos que se ejecutaron cuando la aplicación se bloqueó. Verá que el hilo que causó el bloqueo es el hilo principal, o «Hilo 1».
  • En el editor vemos ese temido hilo 1: error SIGABRT de señal. Ha resaltado la línea 12 en el editor, la definición de clase de AppDelegate.
  • En la parte inferior puede ver resultados de depuración útiles. En este caso, se obtiene una traza apilada y un mensaje de error críptico sobre no ser «compatible con la codificación de valor clave».»

El problema con el error SIGABRT es que es demasiado genérico. Xcode básicamente dice: «Mira, tu aplicación se ha bloqueado, eso es todo lo que sabemos.»En la mayoría de los casos del error SIGABRT, se obtiene poca información sobre la causa del error.

Antes de continuar, discutamos algunos conceptos erróneos y errores comunes de SIGABRT:

  • El error de SIGABRT generalmente no tiene nada que ver con la declaración de clase AppDelegate, aunque resalta esa línea en Xcode. La línea está resaltada porque es la primera línea de código de tu aplicación. No pierdas el tiempo buscando en la clase AppDelegate, a menos que estés absolutamente seguro de que el error está ahí.
  • El stacktrace es una lista de llamadas a funciones que conducen a que la aplicación se bloquee. Eso no significa que la línea de código que causó el error esté en cualquier lugar de la ruta de apilamiento. A veces lo es, pero en otros casos, la traza apilada simplemente conduce al código que se atragantó con un valor que estableció en otro lugar de su propio código.
  • No te quedes ciego ante un error SIGABRT. Hay una causa racional y lógica para el error. Probablemente sea un error en tu propio código, y no hay nada de malo en eso. Las aplicaciones no son mágicas, nadie te persigue y los errores nunca aparecen de la nada. No te frustres con pensamientos como » ¡Ayer funcionó bien!»– siempre lo hace, y ahora no!

Ahora que hemos establecido una línea de base, vamos a llegar a la primera causa de SIGABRT.

Aprender a construir aplicaciones de iOS

empezar con iOS 14 y Swift 5

regístrese para mi iOS curso de desarrollo, y aprender a construir la gran 14 aplicaciones iOS con Swift de Xcode 5 y 12.

Compruebe sus enchufes

Una causa común de» SIGABRT de señal » es un error tipográfico o un error en sus enchufes. Esto es lo que pasó:

  • Creó un nuevo controlador de vista en el creador de interfaces y lo configuró con algunos elementos de interfaz de usuario, como botones y etiquetas
  • Conectó estos elementos de interfaz de usuario a su código mediante propiedades de salida, que crea una conexión entre una propiedad de su controlador de vista y el elemento de interfaz de usuario en el creador de interfaces
  • En un momento dado, cambió el nombre de la propiedad de salida inicial y su aplicación comenzó a bloquearse con un error SIGABRT

utilizará el archivo XIB para generar la interfaz de usuario del controlador de vista cuando se ejecuta la aplicación (en términos generales). En este punto, también conectará salidas desde el XIB a las propiedades de la clase view controller.

Si has cambiado el nombre de una propiedad de outlet, tu app ya no podrá encontrarla. Y por eso lanzará una excepción. Lo que está causando el error SIGABRT, es no manejar esa excepción.

Aquí es lo que parece en Xcode:

SIGABRT error con outlets

¿qué está pasando? La propiedad se llama otherButton, pero la salida sigue llamándose botón. En un momento dado, cambiamos el outlet, porque el nuevo nombre es mejor, y confundimos la aplicación, lo que hizo que se bloqueara.

En la parte superior de la stacktrace también spot otra pista:

Terminating app due to uncaught exception 'NSUnknownKeyException', reason: ': this class is not key value coding-compliant for the key button.

¿Qué significa eso? La aplicación nos dice en este punto que el controlador de vista no cumple con la codificación de valor de clave para la clave button. Esto significa que no puede encontrar la propiedad button en el controlador de vista. Y eso es cierto, porque le hemos cambiado el nombre.

iOS utiliza un mecanismo llamado codificación de valor de clave para inspeccionar las propiedades que tiene un controlador de vista, de modo que pueda usar esas propiedades para hacer referencia a los elementos de la interfaz de usuario que ha creado en función del XIB.

¿Cómo se resuelve el error en este punto? Puede utilizar 2 enfoques:

  1. Cambia el nombre de la propiedad a su nombre original
  2. Elimina la conexión de salida en el Creador de interfaces y vuelve a conectarla utilizando el nuevo nombre de propiedad de salida

¡Sigamos adelante!

Consejo rápido: Al igual que un cambio en @IBOutlet puede causar » Hilo 1: signal SIGABRT», por lo que puede cambiar erróneamente el nombre de una acción, es decir, con @IBAction, causar el error SIGABRT.

Compruebe la traza apilada

En muchos casos, Xcode no le mostrará ningún mensaje de error útil para un bloqueo de SIGABRT. Cuando eso sucede, es útil conocer algunos comandos de depuración, como bt.

Xcode tiene un entorno de depuración integrado llamado LLDB. Es lo que ves en la parte inferior de Xcode cuando se ejecuta tu aplicación, la Consola o el área de salida de depuración. A menudo ves mensajes de depuración aquí, pero ¿sabías que también puedes usarlo para ingresar comandos?

La próxima vez que tu aplicación se bloquee, intenta escribir help en LLDB. Así:

Depuración de SIGABRT en la Consola en Xcode

Verá que muchos de los comandos LLDB corresponden directamente a acciones que puede realizar con el depurador, como establecer puntos de interrupción, pasar por encima de líneas de código e inspeccionar valores de tiempo de ejecución.

Un comando es particularmente útil. Puede escribir bt para ver la pila de llamadas actual (también llamada «backtrace» o «stacktrace»). Esta es una lista de todas las funciones que se ejecutaron hasta el bloqueo actual. Esta traza normalmente incluye la función que causó un error.

Aquí, echa un vistazo a la traza de apilamiento de un error típico de índice fuera de rango. En la imagen siguiente, hemos causado deliberadamente ese error al obtener index 99 de una matriz que solo tiene 4 elementos. Cuando la aplicación se bloquea, bt puede decirnos qué línea de código causó el error.

Ejemplo de índice fuera de rango

Puede detectar la siguiente información en el stacktrace?

  • El código ofensivo está en la línea 21 de ViewController.swift, dentro de la función viewDidLoad()
  • Incluso puede ver que usamos el subíndice «getter» de Array
  • Antes del bloqueo, un montón de se hicieron llamadas a funciones relacionadas con el controlador de vista

En función de la información que obtuvimos con bt, podemos encontrar la línea ofensiva en nuestro código y arreglarla. Xcode ya nos ayudó en este caso, resaltando el error en el editor. En algunos escenarios, no tendrá tanta suerte, y entonces puede ser útil usar el comando bt.

Una última cosa: puede inspeccionar valores en tiempo de ejecución con el comando print. En el escenario anterior, escribir print names habría producido esta salida:

() $R0 = 4 values { = "Ford" = "Arthur" = "Zaphod" = "Trillian"}

Para imprimir objetos complejos, use po. ¡Órale!

Tenga en cuenta que una traza apilada se ejecuta de afuera hacia adentro. La parte inferior de la traza de pila muestra las llamadas a funciones de nivel superior, y cuanto más alta sea la pila, más profundas serán las llamadas. La última, más reciente, llamada de nivel más profundo está en la parte superior de la pila.

Establecer un punto de interrupción de excepción

Puede utilizar puntos de interrupción para detener la ejecución de su código en una línea determinada. En ese punto, puede inspeccionar los valores y pasar a través de las funciones.

Se activa un punto de interrupción de excepción cada vez que se produce una excepción en el código. En lugar de especificar en qué línea se activa el punto de interrupción, debe indicar al depurador que detenga la ejecución de código para las excepciones.

Los puntos de interrupción de excepción son útiles para inspeccionar el código cuando se produce una excepción. Puede ver qué línea de código lanzó la excepción, y puede inspeccionar los valores en su código en ese punto. Algunas excepciones son causadas por errores o estados no válidos de la aplicación, por lo que los puntos de interrupción de excepciones son útiles para encontrar y corregir esos errores.

Aquí le mostramos cómo puede establecer un punto de interrupción de excepción:

  1. Vaya al navegador de puntos de interrupción en Xcode, utilizando las pestañas de la izquierda
  2. Haga clic en el botón inferior izquierdo +y elija Punto de interrupción de excepción
  3. Deje la configuración predeterminada tal cual (aunque es útil personalizarla)
  4. Ejecute su código

Punto de interrupción de excepción

Cuando se lanza una excepción, la ejecución de la aplicación se detiene. Ahora puede usar el depurador para inspeccionar valores, revisar el código y usar comandos LLDB. Cuando sea posible, Xcode te llevará a la línea de código que causó la excepción.

Tenga en cuenta que una excepción no necesariamente bloquea su aplicación. Por lo tanto, cuando se habilita el punto de interrupción de la excepción y se produce una excepción, su aplicación se detiene. Detener el código con un punto de interrupción no es lo mismo que bloquear una aplicación, así que no dejes que eso te confunda.

Por ejemplo, un punto de interrupción de excepción se activará por una excepción de restricciones insatisfechas, pero eso no bloqueará la aplicación. Utilice el punto de interrupción de excepción para recopilar información adicional para el bloqueo de SIGABRT y, a continuación, deshabilítelo una vez que haya resuelto el error (hasta que se vuelva a necesitar).

Aprender a construir aplicaciones de iOS

empezar con iOS 14 y Swift 5

regístrese para mi iOS curso de desarrollo, y aprender a construir la gran 14 aplicaciones iOS con Swift de Xcode 5 y 12.

Leer Más

El SIGABRT de error es bastante críptico, y puede resultar difícil de resolver. ¿Por qué Xcode no puede simplemente dar mensajes de error útiles? Bueno, esa es una buena pregunta

La respuesta corta es que hay tantas partes móviles en el desarrollo de iOS que Xcode no siempre puede determinar la causa de un bloqueo. Xcode no sabe que cambiaste erróneamente el nombre de un outlet. Solo sabe que al conectar la toma de corriente, se invocó algún código, y eso causó una excepción.

Esto significa que siempre verás un error lo más cercano posible a la causa raíz. Lo mejor que puede hacer es cometer muchos errores, descifrar muchos mensajes de error y conocerlos mejor. Y lo que has aprendido en este tutorial, es cómo encontrar y resolver el error SIGABRT!

¿Quieres saber más? Echa un vistazo a estos recursos:

  • Empezar a Depurar en Xcode
  • Comprender El Error «Selector No reconocido Enviado a Instancia» En Xcode
  • Comprender El Error «Se encontró inesperadamente cero al desenvolver un valor Opcional»
  • Comprender El Error «Uso de Identificador No Resuelto» En Xcode
  • Errores Desactivados Por Uno En la Programación de Swift
  • Manejo De Errores En Swift Con Do-Try-Catch