Sesión 5: Depuración y pruebas 2012-2013 Depto. Ciencia de la Computación e IA
Índice de contenidos Trazas de seguimiento NSLogs Asserts El depurador de XCode Breakpoints: Uso y tipos Acciones disponibles en depuración Objetos Zombie Qué son y para qué sirven? Configuración en XCode Instruments Activar Instruments Encontrando fugas de memoria Pruebas de unidad 2
Trazas de segumiento Trazas de seguimiento NSLogs Asserts 3
NSLogs (1) Framework: FoundationKit Equivalente a: fprintf(...). Modificar el código fuente Mostrar en consola el estado de variables Parámetro NSString Uso de especificadores de formato: %@: Cadenas de texto y objetos. %i: Enteros (integer) %d: Decimal (float) %.02f: Número con dos decimales %ld: Entero Long %p: Puntero, referencia a un objeto. Otros... 4
NSLogs (2) Especificador de texto para mostrar la descripción de un objeto: NSLog(@"Descripción del objeto window: %@", self.window); Mostrará la información más relevante del elemento window. Otros objetos: NSString NSDictionary... 5
Trazas de seguimiento Trazas de siguimiento NSLogs Asserts 6
Asserts (1) Usado por los programadores para comprobar partes del código: Valores de variables. Condiciones. Usar sólo durante el desarrollo. Si falla el Assert lanzará una excepción. : NSAssert y NSAssert2. NSAssert es equivalente a assert NSAssert2 permite más parámetros en la descripción. 7
Asserts (2) Uso de NSAsserts: // Uso de la macro assert() assert(valor < maximovalor && @"El valor es demasiado grande!"); // Uso de NSAssert2 NSAssert2(valor < maximovalor, @"El valor %i es demasiado grande (max.:%i)!", valor, maximovalor); 8
Asserts (3) Desactivar los asserts para compilar el proyecto para distribución (release). Directiva NS_BLOCK_ASSERTIONS 9
El depurador de XCode El depurador de XCode Breakpoints: Uso y tipos Acciones disponibles en depuración 10
Breakpoints Internamente: GDB, el depurador de GNU. Aunque podemos cambiarlo a LLDB. Podremos usar la línea de comandos: http://www.gnu.org/s/ gdb/documentation/ Sistema mejorado con XCode 4. Ejecutar el proyecto en modo depuración (debug). Activar breakpoints desde XCode 11
Breakpoints: creación en XCode (1) Pulsar el número de línea en donde queremos activarlo. Estado de un breakpoint: Activado: Color azul. Desactivado: Color azul semitransparente. Navegador de breakpoints: 12
Breakpoints: creación en XCode (2) Breakpoints condicionales: Opción de activar un breakpoint si cumple una condición: ctrl + click en un breakpoint. 13
Breakpoints: Tipos Además del breakpoint común existen dos tipos más: Exception Breakpoint Symbolic Breakpoint. Se crean desde el botón (+) de la parte inferior del navegador de breakpoints. 14
Exception Breakpoint Se ejecuta cada vez que salta una excepción en la ejecución. Detiene la ejecución en el bloque catch o en throw. Acción personalizable (log o sonido). Opción de continuar la ejecución. 15
Symbolic Breakpoint Se ejecuta cuando una función o método específico se ejecuta. El campo símbolo puede ser: El nombre de un método: pathsmatchingextensions: El método de una clase: [SKTLine drawhandlesinview] Un nombre de una función: _objc_msgforward Acción personalizable (log o sonido). Opción de continuar la ejecución. 16
El depurador de XCode El depurador de XCode Breakpoints: Uso y tipos Acciones disponibles en depuración 17
Acciones disponibles en depuración (1) Analizar los valores de las variables. Crear un watchpoint: breakpoint en variable. La ejecución se detendrá cuando el valor de la variable cambie. Usar la línea de comandos. Comandos de GDB. Editar el listado de breakpoints. Podemos desactivar, activar, borrar breakpoints durante la depuración. Cambiar la localización de la aplicación (simular GPS). 18
Acciones disponibles en depuración (2) Continuar hasta la siguiente línea in entrar en funciones (step over, n) Continuar hasta el siguiente breakpoint (continue, c) Continuar hasta la siguiente línea entrando en las funciones (step into, s) Empezar de nuevo o abortar la ejecución (finish, f) 19
Objetos Zombie Objetos Zombie Qué son y para qué sirven? Configuración en XCode 20
Qué son y para qué sirven? (1) Parámetro de compilación. Proporciona más detalles cuando se producen excepciones relacionadas con accesos a memoria. Os suena EXC_BAD_ACCESS? Nombre parámetro: NSZombieEnabled. 21
Qué son y para qué sirven? (2) Ejemplo: Liberamos de memoria una variable que ya hemos liberado anteriormente. Sin usar objetos Zombie: Usando objetos Zombie: 22
Objetos Zombie Objetos Zombie Qué son y para qué sirven? Configuración en XCode 23
Configuración en XCode Activar: Edit Scheme > Diagnostics > Enable Zombie Objects. 24
Instruments Instruments Activar Instruments Encontrando fugas de memoria 25
Activar Instruments (1) Aplicación adicional al depurador de XCode. Se instala junto con XCode. Varias herramientas disponibles divididas por el componente del sistema a analizar: Memoria, CPU y Sistema de ficheros. Objetivo: analizar el uso de la memoria y comprobar si existen fugas de memoria (memory leaks). 26
Activar Instruments (2) 27
Activar Instruments (3) Menú principal de XCode: Product > Profile. Podemos analizar la ejecución del simulador o del dispositivo. Para analizar las fugas de memoria seleccionamos las herramientas Allocations y Leaks. Allocations -> Analizar el uso de la memoria. Leaks -> Analizar fugas de memoria. 28
Herramienta Allocations Allocations: En azul las reservas de memoria que se van produciendo. Listado de objetos que van reservando memoria ordenados por la cantidad que reservan. 29
Herramienta Leaks Leaks: En rojo las fugas de memoria (objetos que han reservado memoria y la han liberado). Si seleccionamos una fuga de memoria accederemos al código fuente en donde se genera esta fuga. Podemos corregir las fugas de memoria desde Instruments cambiando el código fuente. 30
Encontrando fugas de memoria Instruments Activar Instruments Encontrando fugas de memoria 31
Encontrando fugas de memoria (1) Pantalla principal de Leaks en funcionamiento: 32
Encontrando fugas de memoria (2) Configuración de detección de Leaks cada cierto tiempo: 33
Encontrando fugas de memoria (3) Análisis de la traza de una fuga de memoria: 34
Pruebas de unidad Pruebas de unidad 35
Pruebas de unidad Objetivo: probar el funcionamiento de un módulo o un método concreto y reducir el número de fallos. XCode integra la generación de tests de unidad. Un grupo de tests de unidad (test bundle) contiene varios tests. Un test bundle prueba una funcionalidad de la aplicación. Framework: SenTestingKit 36
Creando tests de unidad (1) Al crear un proyecto en XCode podemos incluir tests de unidad. 37
Creando tests de unidad (2) Target específico en XCode: 38
Creando tests de unidad (3) Macros disponibles en el framework SenTestingKit Método setup: crear las variables y configurarlas. Método teardown: liberar los objetos de memoria. - (void)testmitestdeprueba {... // Configuración inicial (setup) ST... // Asserts...! // Liberación de memoria y variables auxiliares } - (void)setup { objeto_test = [[[MiClase alloc] init] retain]; STAssertNotNil(objeto_test, @"No se puede crear un objeto de la clase MiClase"); } - (void)teardown { [objeto_test release]; } 39
Algunas macros... STFail: Falla el test. STAssertEqualObjects: Falla cuando dos objetos no son iguales. STAssertEquals: Falla cuando dos valores no son iguales. STAssertNil: Falla cuando la expresión no es nil. STAssertNotNil: Falla cuando la expresión es nil. STAssertTrue: Falla cuando la expresión no es true. STAssertFalse: Falla cuando la expresión no es false. STAssertThrows: Falla cuando la expresión no lanza una excepción. etc... https://developer.apple.com/library/ios/#documentation/developertools/ Conceptual/UnitTesting/AB-Unit-Test_Result_Macro_Reference/ result_macro_reference.html 40
Preguntas...? 41