El tutor de nuestro curso online de Desarrollo de Aplicaciones para Android, Víctor Ramírez Las,…
Depuración de aplicaciones: puntos de interrupción (breakpoints)
1.
Depuración de aplicaciones: puntos de interrupción (breakpoints)
Un aspecto que todo programador debe dominar es la capacidad de detectar y solucionar los errores de código que inevitablemente se producen en el desarrollo de aplicaciones.
Es importante que conozca bien las técnicas que agilizan el descubrimiento de estos errores porque pueden causarle retrasos considerables en la realización de sus proyectos de software.
Ya hemos tratado distintos aspectos de la depuración de aplicaciones Android en tutoriales anteriores, por ejemplo:
- La conexión mediante ADB
- La depuración de procesos a través de DDM
- La depuración de bases de datos SQLite mediante mensajes en el panel LogCat
En esta ocasión, vamos a tratar en detalle un aspecto más clásico de la depuración, como es la ejecución paso a paso del código, realizando la inspección de variables en un punto concreto y viendo los distintos tipos de condiciones de parada que podemos establecer.
Pese a que nos centraremos en un ejemplo de aplicación Android con el entorno de desarrollo Android Studio cabe decir que lo visto serviría prácticamente sin ningún cambio para otras muchas combinaciones de lenguajes e IDEs (C# y Visual Studio, Eclipse o Netbeans con Java, etc).
Depuración de aplicaciones
Existen múltiples formas de depurar una aplicación: podemos analizar si las salidas de datos se corresponden con las esperadas, leer los ficheros de logs en busca de mensajes que nos den información sobre lo que ha sucedido en un momento dado o incluso conectar el proyecto a nuestro dispositivo para ver los procesos en ejecución o la memoria del mismo.
Cada una de ellas puede ser útil para resolver un problema determinado, sin embargo existen errores que requieren un análisis más detallado para dar con la causa que los provocan.
Para estos casos es muy útil utilizar las herramientas integradas en el propio entorno de desarrollo, de forma que tengamos totalmente clara la relación entre la línea de nuestro código fuente que se esta ejecutando y el estado de nuestra aplicación. De esta manera podemos identificar rápidamente comportamientos inesperados.
Hace años el depurador era una aplicación independiente que recibía nuestro ejecutable compilado de forma especifica, lo que hacía el proceso más lento e incómodo. Sin embargo, hoy día, la mayoría de los entornos incluyen el depurador y sólo necesitamos ejecutar nuestra aplicación en un modo distinto, de forma que el proceso está totalmente integrado con el propio desarrollo del código.
En la imagen superior podemos ver el depurador ddd, uno de los más utilizados para desarrollar aplicaciones C y C++ en sistemas Linux desde hace muchos años.
Vamos a presentar a continuación un concepto crucial para la depuración: el punto de interrupción.
Punto de interrupción
Un punto de interrupción (también conocido en inglés por breakpoint) es una marca que ponemos en una linea de nuestro código fuente, de tal forma que cuando la ejecución llegue a ese punto el proceso de nuestra aplicación se detendrá y podremos analizar su estado en ese momento, justo antes de ejecutar esa linea de código.
Podemos poner tantos como queramos y normalmente nos interesará situarlos en puntos críticos en los que creamos que se pueden estar produciendo errores.
En Android Studio para situar uno bastará con hacer click en la parte izquierda de nuestra linea de código, junto al indicador del número de linea. Aparecerá un circulo rojo indicándolo como podemos ver en la siguiente imagen.
Un detalle importante para que la ejecución se detenga es que debemos lanzar nuestra aplicación en modo depuración mediante el botón «Debug app» de Android Studio, según mostramos en la siguiente imagen, o pulsando la combinacion de teclas Mayúsculas + F9.
Hay que tener en cuenta que la depuración es un proceso costoso a nivel de recursos por lo que es aconsejable ejecutar en este modo sólo cuando encontremos un error que necesitemos resolver. Luego podemos continuar ejecutando en modo normal en el resto de pruebas.
También es común que el rendimiento sea mejor si conectamos nuestro dispositivo mediante USB en lugar de utilizar el emulador.
Existen opciones avanzadas para sacar más partido a los breakpoints según el punto de la aplicación en el que nos encontremos. En Android Studio si pulsamos con el botón derecho del ratón sobre uno de ellos nos aparecerá la siguiente la siguiente ventana con funciones adicionales:
Algunas de las opciones son las siguientes:
- Condition: podemos indicar una expresión booleana, que se evaluará en el momento de llegar al punto de interrupción, deteniendo la ejecución sólo si la condición devuelve el valor «True».
- Remove one hit: si marcamos esta opción el punto de interrupción se deshabilitará después de que se pare la ejecución en el la primera vez.
- Evaluate and log: podemos ejecutar una expresión y escribir en el log su valor.
- Pass count: en este caso la ejecución solo se detendrá cuando pasemos por el punto de interrupción un número determinado de veces, puede ser útil para analizar bucles sin detenernos en cada iteración por ejemplo.
Vemos en la siguiente imagen cómo podríamos por ejemplo detenernos sólo en caso de que nuestro TextBox editNombre este vacío, deshabilitando el punto de interrupción después de la primera parada:
Como se ve, hemos marcado la opción ‘Condition’ e introducido la linea: editNombre.getText().toString()==""
En el próximo tutorial veremos que acciones podemos llevar a cabo al detenernos en un punto de interrupción y cómo inspeccionar el valor de las variables.
Finalizaremos la serie con un ejemplo de uso de estas técnicas en una aplicación, mostrando todo el proceso en un video.