Debug en Android: Trucos y consejos

Logcat

El logcat puede ser muy útil para poder visualizar información sin necesidad de parar el hilo de ejecución. A continuación, vamos a investigar diferentes trucos que podemos utilizar para facilitar el uso de la consola de logs.

 

Modificar la información que se muestra

La captura inferior es un ejemplo de las trazas del log de Android. Utilizando el botón resaltado en rojo podemos acceder a más opciones:

En estas opciones, podemos ocultar datos que no nos pueden interesar como: la fecha, el id del hilo y el paquete de la aplicación.

 

Crear filtros personalizados

Igual que tienes acceso a varios filtros predefinidos, también tienes la posibilidad de crear filtros personalizados, para poder guardar búsquedas que se hacen a menudo. Para crear un filtro de log tienes que hacer clic en “Edit Filter Configuration” en el desplegable de filtros (a la derecha de la búsqueda).

Se nos mostrará un popup donde configurar el filtro que vamos a crear, al utilizar regex podemos usar el carácter “*” como wildcard.

Una vez creado el filtro, nos aparecerá como opción seleccionable en el desplegable de filtros.

 

Ocultar partes del log usando la opción colapsar

En ciertos casos puede ocurrir que queremos eliminar ciertas líneas del log de manera visual, pero nos interesa poder acceder a ellas siempre que se necesite. Para ello entra en juego la opción de colapsar las líneas del log (fold the lines).

Para utilizar esta opción es necesario seleccionar el texto común de las líneas que queremos colapsar y después hacer clic derecho sobre el texto seleccionado, eligiendo la opción de “Fold Lines Like This”.

Para este ejemplo seleccionamos “New Move”

En el siguiente pop up pulsamos “Ok” para crear un filtro que colapse las líneas.

Si en cualquier momento queremos ver qué contienen las líneas colapsadas solo necesitamos hacer clic en “Internal lines”.

Nota

Trabajar con el logcat va a mejorar mucho en las futuras versiones de Android Studio. Recientemente en la versión de Android Studio Dolphin Canary 6 se han agregado funcionalidades nuevas para agilizar el uso de logcat.

Breakpoints

Añadir una condición al breakpoint

En ocasiones en las que un breakpoint se ejecute dentro de un bucle, comprobar el estado de la aplicación en cada iteración puede ser tedioso. Para ello podemos añadir una condición a nuestro breakpoint y que la ejecución se detenga solamente cuando se dé una determinada condición. Para ello haremos clic derecho sobre el breakpoint y en el campo “Condition” indicamos la condición:

Las condiciones que se utilicen pueden escribirse tanto en Java como en Kotlin, otra cosa muy útil es que puede utilizar el botón de las flechas al final del campo para permitir escribir código multilínea. Esto puede ser útil si necesitamos crear variables intermedias o hacer algún tratamiento a los valores antes de la condición.

Aviso

Puede ocurrir que un breakpoint con condición ralentice mucho la ejecución de la aplicación, en ese caso es mejor crear un if en el código de la aplicación para meter el breakpoint dentro.

 

Arrastrar un breakpoint

Si mantenemos clic sobre un breakpoint es posible arrastrarlo hasta otra línea. Además, las condiciones previamente definidas se mantendrán después de haber movido el breakpoint. Si hacemos el arrastre anterior mientras mantenemos pulsado la tecla option / alt nos creará una copia exacta del breakpoint.

 

Dependencia entre breakpoints

Podemos mantener un breakpoint deshabilitado hasta que nuestra ejecución pase por otro breakpoint. Esto es posible haciendo clic derecho sobre el breakpoint que queremos deshabilitar y luego en la opción “More”.

En la parte inferior tenemos la sección “Disable until hitting the following breakpoint” donde tenemos un selector para seleccionar el breakpoint por el que tiene que pasar primero para que salte el actual.

Nota

Podemos encadenar las dependencias entre breakpoints, por ejemplo si tenemos tres breakpoints (A, B y C) podemos hacer que A solo salte si se ha pasado por B y que a su vez B solo salte si se ha pasado por C. De esta manera A solo saltaría si se pasa primero por C y luego por B.

Breakpoints que no paran la ejecución

Android Studio permite añadir breakpoints que no paren la ejecución de la aplicación. Para desactivar la suspensión de la ejecución es necesario desactivar el check de “Suspend” al hacer clic derecho en el breakpoint.

Los breakpoint que no suspenden la ejecución se ponen de color amarillo, y tienen varios parámetros con los que podemos configurar lo que queremos que se vea por la terminal de logs.

Si activamos la opción “‘Breakpoint hit’ message” cuando se pase por ese breakpoint se va a mostrar un mensaje predeterminado, puedes hacer clic en el mensaje para abrir el fichero con la línea de código señalada. Ejemplo del mensaje que se muestra:

Activando la opción de “Stack Trace” se va a realizar en el log un volcado de la pila para poder determinar desde donde se ha llamado el método donde se encuentra el breakpoint.

Por último, podemos utilizar la opción de “Evaluate and log” para mostrar el valor de cualquier variable/atributo que se desee. Esta opción es equivalente a escribir un println permitiendo mostrar lo que necesitemos en la terminal de debug.

Nota

Si queremos poner directamente un breakpoint sin suspensión que tenga configurada la opción de “‘Breakpoint hit’ message”, Android Studio tiene un atajo para hacerlo de forma directa. Solo hay que hacer clic + shift en el margen izquierdo.

 

Organización de breakpoints

Cuando estemos a la caza de un bug en nuestra aplicación, podemos crear grupos de breakpoints para poder organizarlos y permitirnos habilitar/deshabilitar todos los breakpoints pertenecientes a un grupo. Esto puede ser muy útil, por ejemplo, si estamos en mitad de una sesión de debug y de repente llega un fallo de producción más urgente, en ese caso podemos agrupar todos los breakpoints y deshabilitarlos, para así poder volver más tarde y retomarlo justo donde se dejó.

Para crear un nuevo grupo, haz clic derecho en un breakpoint y luego haz clic en “More”. En la columna de la izquierda se visualizan todos los breakpoints que tenemos tanto activos como no activos:

Para crear un nuevo grupo solo es necesario seleccionar todos los breakpoints que queramos agrupar y después hacer clic derecho → “Move to Group” → “Create New”:

Una vez creado el grupo podemos agregar más breakpoints utilizando los pasos anteriores, pero en vez de “Create New” solo hay que seleccionar el grupo ya creado. Mediante el check que se encuentra a la izquierda del nombre podemos habilitar/deshabilitar todos los breakpoints que están dentro.

Nota

El botón de “-” que está encima de la vista de breakpoints nos permite eliminar tanto breakpoints individuales como grupos de breakpoints. Además los botones a su derecha permiten la agrupación rápida de breakpoints por: paquetes, ficheros y clases.

 

Unirte a un proceso ya lanzado

Una vez lanzada la app, podemos hacer hacer un “attach” del debugger sin tener que relanzar de nuevo nuestra app. Para ello tendremos que hacer clic en el icono:

Y a continuación seleccionar el proceso de nuestro dispositivo:

 

Etiquetado de variables

Cuando estamos haciendo debug, y tenemos la ventana de debug abierta podemos etiquetar las referencias de los objetos que queramos. Para etiquetar una referencia a un objeto tenemos que hacer clic derecho → “Mark Object” en la variable dentro del modo debug:

En el pop up podemos escribir el nombre que queramos, una vez marcado se muestra la etiqueta junto al nombre de la variable, en el ejemplo anterior, si a la variable “head” la etiquetamos como “prueba”, se va a mostrar: [prueba] head

La utilidad de etiquetar la referencia a un objeto es poder acceder a la instancia a lo largo de la sesión de debug sin necesidad de recordar el número de registro de la variable. Una vez nombrada, podemos hacer referencia a la etiqueta utilizando la nomenclatura “[nombre]__DebugLabel” siendo “[nombre]” el nombre que le hemos puesto a la etiqueta. Un caso muy útil que nos puede interesar es por ejemplo que se lance un breakpoint si una variable es la etiquetada:

 

Watches

La sección de watches cuando hacemos debug nos permite agregar cualquier variable/expresión y observar su valor mientras se ejecuta la aplicación. Incluso podemos escribir expresiones y ver el resultado de estas mientras hacemos debug:

En este ejemplo estamos observando el atributo “halfMargin” de la variable “food” y el resultado que tiene al multiplicarlo por 4.

 

Evaluación de expresiones

Una utilidad muy útil cuando tenemos la aplicación en suspensión porque estamos haciendo debug, es el cuadro de evaluación de expresiones. Para acceder a él, es necesario hacer clic en el siguiente botón:

Una vez abierto, en este cuadro podemos escribir el código que necesitemos evaluar y ejecutarlo para ver el resultado. Al activar la opción multilínea podemos escribir código como si lo estuviéramos escribiendo en un fichero. Además en este cuadro podemos hacer referencia a las variables y funciones del código que está en suspensión.

 

Análisis de stacktrace

Cuando recibimos un stack trace o un volcado de un hilo en forma de texto Android Studio tiene una manera para procesarlo y hacer que sea navegable. Para esto tenemos que acceder al menú de la barra superior e ir a “Analyze → Stack trace or Thread Dump”. En el cuadro de diálogo que se nos abre si tenemos en el portapapeles copiado el stack trace a analizar automáticamente lo pega en el cuadro de texto. Al pulsar “Ok” nos abre la excepción formateando las clases y las líneas para poder navegar de manera sencilla por la pila.

 

Últimos trucos para acabar

A continuación, voy a listar de manera breve algunos trucos que merecen mención, pero no un apartado para cada uno:

  • Ctrl + arrastar para copiar un breakpoint y sus atributos.
  • Para deshabilitar un breakpoint se puede usar alt/options + clic
  • Breakpoints en variables que te permiten parar la ejecución en la lectura o escritura de la variable.
Anterior

Metodología AGILE: ¿camino o destino?

Siguiente

Como idear una intranet

como crear una intranet
Talento O2O

¿Te apetece formar parte de nuestro equipo?

Mira las oportunidades