En este tutorial, depuraremos una aplicación iOS con Xcode de Apple. Xcode es un entorno robusto para desarrollar y solucionar problemas de aplicaciones iOS. Veremos cómo podemos usarlo, junto con el Informe de bloqueo de iOS de Raygun , para abordar rápidamente una deficiencia de la aplicación.
Seguiremos seis pasos para examinar una aplicación simple y aislar y corregir un error.
  1. Configurar un proyecto de muestra
  2. Analizar un informe de depuración Raygun
  3. Explora las herramientas de depuración de Xcode para iOS
  4. Establecer un punto de interrupción en Xcode
  5. Ejecutar la aplicación con un punto de interrupción.
  6. Aislar el error y arreglarlo
Este tutorial requiere una computadora macOS con Xcode instalado. Usaremos la versión actual de Xcode en el momento de escribir este artículo, que es la versión 10. El código fuente de este proyecto está disponible en Github.
¡Entonces empecemos!

Paso 1: Proyecto de muestra

Usaremos una aplicación iOS de una sola vista para este tutorial. La vista única tiene un botón con texto que cambia para cada pulsación. Si desea seguirlo, deberá registrarse para obtener una cuenta de Raygun . Después de revisar el proyecto, agregue su clave Raygun API (Interfaz de programación de aplicaciones) didFinishLaunchingWithOptionsenAppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
[[Raygun sharedReporterWithApiKey:@"YOUR_RAYGUN_KEY"] attachPulse];
return YES;
}
Puede encontrar instrucciones completas para configurar una aplicación iOS . Puedes seguir este tutorial con tu aplicación si lo prefieres.
Aquí está la vista de inicio de la aplicación de muestra.
Debug iOS: Imagen de la vista de la aplicación de muestra
Cada vez que toca el botón, el texto de la pantalla cambia. Después de unas pocas pulsaciones, la aplicación se bloquea. Imagine que esta aplicación ha sido lanzada a la App Store y ya fue aprobada. ¡Necesitas localizar el error rápido!

Paso 2: Analizar el informe de depuración Raygun {analizar}

Afortunadamente, integró su aplicación con Raygun Error Monitoring y Crash Reporting , de modo que puede usar la información para tener una idea de dónde buscar el error.
Primero, echemos un vistazo al resumen de errores.
Debug iOS: Imagen del informe de instancia de error en Raygun
Como forzamos el error ahora, no necesitamos la fecha ni la hora. Pero en el caso de que ocurran errores en las aplicaciones implementadas, la fecha y la hora pueden ser ventajosas. El nombre de la clase y el mensaje de error nos dicen mucho sobre el error. NSRangeException indica que el código excedió los límites de una estructura de datos, y el informe sugiere que un subíndice fuera de rango está causando el bloqueo. Raygun también proporciona un seguimiento para el error.
Debug iOS: Imagen del backtrace en Raygun
Ya que estamos lidiando con una excepción no detectada, el retroceso solo nos proporciona una idea aproximada de dónde está ocurriendo el error; En algún lugar en UIKit. Por lo tanto, tendremos que ejecutar la aplicación en un depurador para encontrar la ubicación exacta.

Paso 3: depuración de iOS con Xcode

Xcode proporciona a los desarrolladores de iOS un entorno integrado para desarrollar, probar y depurar aplicaciones de iOS. El simulador soporta todas las plataformas actuales de iOS. Puede instalar y ejecutar aplicaciones con un solo clic, y el entorno tiene soporte integrado para el lldbdepurador.
Debug iOS: Imagen del depurador lld
Entonces, puedes depurar tu aplicación en tu escritorio de desarrollo. Comencemos por replicar el error en el simulador.
Depurar iOS: imagen de cómo replicar el error en el simulador
Queremos asegurarnos de que ejecutamos una compilación de depuración, así que empiece por mantener presionada la optiontecla y hacer clic en el icono de ejecución en la parte superior izquierda de Xcode. Esto abre el diálogo de opciones de ejecución.
Asegúrese de que ha Runseleccionado en el lado izquierdo, y la construcción de depuración habilitada a la derecha. Ahora, haga clic en el botón Ejecutar. Una vez completada la compilación, la aplicación se iniciará en el simulador.
Debug iOS: imagen de la aplicación comenzando en el simulador.
A continuación, haga clic en el botón de la aplicación iOS hasta que la aplicación lance la excepción y el depurador aparezca en Xcode.
Debug iOS: Imagen del depurador en XCode
En el lado izquierdo, el navegador de depuración muestra los subprocesos de la aplicación. Xcode destaca los aspectos principales en el subproceso # 1, ya que las excepciones no detectadas "se acumulan" en esa ubicación en la aplicación. En el panel del editor, Xcode resalta esa función en main.m. Xcode nos muestra que un SIGABRT fue lanzado dentro de main. Abajo en la parte inferior de la interfaz de línea de comandos de Xcode lldb está disponible. Vamos a controlarlo desde la GUI (Graphical User Interface).
Finalmente, haga clic en el botón de detener, junto a ejecutar, para detener la sesión de depuración. Raygun ya nos dijo que la aplicación tiene una excepción no detectada, por lo que aún no hemos aprendido nada nuevo sobre el error. Ahora, usemos Xcode para detectar la excepción y descubrir de dónde viene.

Paso 4: Establecer punto de interrupción de excepción

Entonces, ve al Debugmenú, selecciona BreakpointsCreate Exception Breakpoint.
Debug iOS: Imagen del depurador en XCode
Xcode muestra el navegador de punto de interrupción a la izquierda y aparecerá una ventana emergente.
Debug iOS: Imagen del depurador en XCode
El valor predeterminado es interrumpir las excepciones C ++ y Objective C y detener el depurador donde se lanzan. Esto nos llevará a donde se produce el problema. A continuación, haga clic en cualquier lugar para descartar la ventana emergente y aceptar los valores predeterminados.

Paso 5: Ejecutar la aplicación con punto de interrupción.

Ahora, vuelva a ejecutar la aplicación y fuerce el error.
Debug iOS: Imagen del depurador en XCode
El depurador se detuvo cuando la aplicación generó la excepción y destacó la línea de código responsable.
Debug iOS: Imagen del depurador en XCode
Al igual que puede esperar del informe de errores de Raygun, el código hace referencia a una matriz. El problema está claro al ver la línea resaltada. Estamos incrementando el índice de matriz sin verificar los límites. Si miras hacia abajo en la ventana de depuración en Xcode, puedes ver que el contador de alguna manera llegó a un valor de cinco cuando la matriz solo tiene cuatro elementos.
La aplicación debería haberse bloqueado antes de lo que lo hizo.
Pero ¿y si el problema fuera más difícil de aislar? Agreguemos un punto de interrupción más y pasemos por la aplicación nuevamente.

Paso 6: Aislar el error y solucionarlo

Primero, detén la sesión de depuración.
A continuación, haga doble clic junto a la línea ofensiva en el código fuente para abrir una ventana emergente de diálogo de punto de interrupción.
Debug iOS: Imagen del depurador en XCode
Agregar una condición para el punto de interrupción; counter > 3.
Vuelva a ejecutar la aplicación y, cuando fuerce el error, se detendrá antes de que iOS arroje la excepción. El índice de matriz y el incremento están en la misma línea de código. Por lo tanto, continuar después del punto de interrupción aún dará lugar a que iOS lance la excepción. Este punto de interrupción aclara el error y podemos ver cómo las interrupciones condicionales pueden ayudar a aislar un problema espinoso.
Hay varias formas de solucionar este error. La mayoría de los mejores tienen un diseño diferente, pero vamos por una solución rápida.
@implementation ViewController

int counter = 0;

NSArray *labels = nil;
+ (void)initialize {
labels = @[@"Ow!", @"Ouch!", @"Oof!", @"Stop!"];
}

- (IBAction)boomButton:(id)sender {

if (counter == 3) {
counter = 0;
} else {
++counter;
}

[sender setTitle:[labels objectAtIndex: counter] forState:UIControlStateNormal];

}

- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}

@end
Al verificar los límites de la matriz antes de que incrementemos el contador, nunca excedemos la longitud de la matriz. Vuelva a ejecutar la aplicación, y el bloqueo se ha ido.

Próximos pasos

La herramienta de desarrollo XCode de Apple simplifica la depuración de aplicaciones iOS. Proporciona soporte integrado para un depurador avanzado, así como accesos directos basados ​​en GUI para tareas comunes como agregar puntos de interrupción.
Afortunadamente, también puede confiar en su simulador para emular con precisión el conjunto completo de dispositivos iOS ya que Apple controla la plataforma. Una vez que haya verificado que un problema se soluciona en el simulador, puede enviar a dispositivos locales y realizar pruebas allí también.
Por supuesto, con Raygun, tiene una capa adicional de protección para detectar, diagnosticar y eliminar errores de iOS. El informe de Raygun en este ejemplo nos dijo cuál fue el error y lo hizo mucho más fácil de aislar. Las alertas inteligentes y la agrupación de errores de Raygun significan que nunca volverás a perder un error en tu aplicación. Lea más sobre informes de fallas de iOS