Android Studio proporciona un depurador que te permite hacer lo siguiente y más:
- Seleccionar un dispositivo para depurar tu aplicación.
- Establecer puntos de interrupción en tu código Java, Kotlin y C/C++.
- Examinar variables y evaluar expresiones en tiempo de ejecución.
Esta página incluye instrucciones para las operaciones básicas del depurador. Para obtener más documentación, consulte también los documentos de depuración de IntelliJ IDEA.
- Habilitar la depuración
- Iniciar la depuración
- Adjunta el depurador a una aplicación en ejecución
- Cambiar el tipo de depurador
- Usa el registro del sistema
- Escribe mensajes de registro en tu código
- Ver el registro del sistema
- Trabajar con puntos de interrupción
- Ver y configurar puntos de interrupción
- Marcos de la ventana de depuración
- Inspeccionar variables
- Añadir puntos de vigilancia
- Ver y cambiar el formato de visualización de los valores de los recursos
Habilitar la depuración
Antes de que pueda comenzar a depurar, debe prepararse de la siguiente manera:
- Habilitar la depuración en su dispositivo:
Si está utilizando el emulador, esto está habilitado por defecto. Pero para un dispositivo conectado, necesitas habilitar la depuración en las opciones de desarrollo del dispositivo.
- Ejecuta una variante de compilación depurable:
Debes usar una variante de compilación que incluya
debuggable true
en la configuración de compilación. Normalmente, puedes seleccionar la variante de «depuración» por defecto que se incluye en todos los proyectos de Android Studio (aunque no sea visible en el archivobuild.gradle
). Pero si defines nuevos tipos de compilación que deben ser depurables, debes añadir `debuggable true` al tipo de compilación:android { buildTypes { customDebugType { debuggable true ... } }}
Esta propiedad también se aplica a los módulos con código C/C++. (La propiedad
jniDebuggable
ya no se utiliza.)Si su aplicación depende de un módulo de biblioteca que también desea depurar, esa biblioteca también debe estar empaquetada con
debuggable true
para que conserve sus símbolos de depuración.Para asegurarse de que las variantes depurables de su proyecto de aplicación reciben la variante depurable de un módulo de biblioteca, asegúrese de publicar versiones no predeterminadas de su biblioteca.
Iniciar la depuración
Puedes iniciar una sesión de depuración de la siguiente manera:
- Configura algunos puntos de interrupción en el código de la aplicación.
- En la barra de herramientas, selecciona un dispositivo para depurar tu aplicación en el menú desplegable del dispositivo de destino.
Si no tienes ningún dispositivo configurado, entonces necesitas conectar un dispositivo a través de USB o crear un AVD para utilizar el emulador de Android.
- En la barra de herramientas, haz clic en Depurar .
Si ves un cuadro de diálogo que te pregunta si quieres «cambiar de Ejecutar a Depurar», significa que tu aplicación ya se está ejecutando en el dispositivo y que se reiniciará para empezar a depurar. Si prefieres mantener la misma instancia de la aplicación en ejecución, haz clic en Cancelar depuración y, en su lugar, adjunta el depurador a una aplicación en ejecución.
De lo contrario, Android Studio construye un APK, lo firma con una clave de depuración, lo instala en el dispositivo seleccionado y lo ejecuta. Si añades código C y C++ a tu proyecto, Android Studio también ejecuta el depurador LLDB en la ventana de depuración para depurar tu código nativo.
- Si la ventana de depuración no está abierta, selecciona Ver > Ventanas de herramientas > Depuración (o haz clic en Depuración en la barra de la ventana de herramientas), y luego haz clic en la pestaña Depurador, como se muestra en la figura 1.
Figura 1. La ventana del depurador, mostrando el hilo actual y el árbol de objetos para una variable
Adjunta el depurador a una aplicación en ejecución
Si tu aplicación ya se está ejecutando en tu dispositivo, puedes empezar a depurar sin reiniciar tu aplicación de la siguiente manera:
- Haz clic en Adjuntar depurador al proceso de Android .
- En el cuadro de diálogo Elegir proceso, seleccione el proceso al que desea adjuntar el depurador.
Si estás usando un emulador o un dispositivo rooteado, puedes marcar Mostrar todos los procesos para ver todos los procesos.
En el menú desplegable Usar la configuración del depurador de Android desde, puedes seleccionar una configuración de ejecución/depuración existente. (En el caso del código C y C++, esto te permite reutilizar los comandos de inicio de LLDB, los comandos posteriores a la incorporación de LLDB y los directorios de símbolos en una configuración existente). Si no tiene una configuración de ejecución/depuración existente, seleccione Crear nuevo. Esta selección habilita el menú desplegable Tipo de depuración, donde puedes seleccionar un tipo de depuración diferente. De forma predeterminada, Android Studio utiliza el tipo de depuración automática para seleccionar la mejor opción de depuración para ti, en función de si tu proyecto incluye código Java o C/C++.
- Haga clic en Aceptar.
Aparece la ventana de depuración.
Nota: El depurador de Android Studio y el recolector de basura están vagamente integrados. La máquina virtual de Android garantiza que cualquier objeto del que tenga conocimiento el depurador no se recoge de la basura hasta después de que el depurador se desconecte. Esto puede resultar en una acumulación de objetos a lo largo del tiempo mientras el depurador está conectado. Por ejemplo, si el depurador ve un hilo en ejecución, el objeto Thread
asociado no se recoge de la basura hasta que el depurador se desconecta, incluso si el hilo ha terminado.
Cambiar el tipo de depurador
Debido a que se requieren diferentes herramientas de depuración para depurar el código Java/Kotlin y el código C/C++, el depurador deAndroid Studio le permite seleccionar qué tipo de depurador utilizar. Por defecto, Android Studiodecide qué depurador utilizar en función de los lenguajes que detecta en tu proyecto (con el tipo de depuradorAuto). Sin embargo, puedes seleccionar manualmente el depurador en la configuración de depuración (haz clic en Ejecutar > EditarConfiguraciones) o en el diálogo que aparece cuando haces clic en Ejecutar > Adjuntar depurador a Androidprocess.
Los tipos de depuración disponibles incluyen los siguientes:
Auto Seleccione este tipo de depuración si desea que Android Studio elija automáticamente la mejor opción para el código que está depurando. Por ejemplo, si tiene algún código C o C++ en su proyecto, Android Studio utiliza automáticamente el tipo de depuración Dual. De lo contrario, Android Studio utiliza el tipo de depuración Java. Java Selecciona este tipo de depuración si quieres depurar solo el código escrito en Java o Kotlin; el depurador de Java ignora cualquier punto de interrupción o vigilancia que establezcas en tu código nativo. Nativo (disponible sólo con código C/C++) Selecciona este tipo de depuración si quieres usar sólo LLDB para depurar tu código. Cuando se utiliza este tipo de depuración, la vista de sesión del depurador de Java no está disponible. Por defecto, LLDB inspecciona sólo tu código nativo e ignora los puntos de interrupción en tu código Java. Si quieres depurar también tu código Java, debes cambiar al tipo de depuración Auto o Dual.
La depuración nativa sólo funciona en dispositivos que cumplen los siguientes requisitos:
-
El dispositivo admite
run-as
.Para comprobar si el dispositivo admite
run-as
, ejecute el siguiente comando en el shell de ADB que está conectado a su dispositivo:run-as your-package-name pwd
Sustituya
your-package-name
por el nombre del paquete de su aplicación. Si el dispositivo admiterun-as
, el comando debería devolver sin errores. -
El dispositivo tiene
ptrace
habilitado.Para comprobar si
ptrace
está habilitado, ejecute el siguiente comando en el shell ADB que está conectado a su dispositivo:sysctl kernel.yama.ptrace_scope
Si
ptrace
está habilitado, el comando imprimirá el valor0
o un errorunknown key
. Siptrace
no está habilitado, imprimirá un valor distinto de0
.
Dual (disponible sólo con código C/C++) Seleccione este tipo de depuración si desea alternar entre la depuración de código Java y nativo. Android Studio adjunta tanto el depurador de Java como el LLDB al proceso de tu aplicación, uno para el depurador de Java y otro para el LLDB, para que puedas inspeccionar los puntos de interrupción tanto en tu código Java como en el nativo sin reiniciar tu aplicación ni cambiar la configuración de depuración.
En la figura 2, observa las dos pestañas a la derecha del título de la ventana de depuración. Como la app tiene código Java y C++, una pestaña es para depurar el código nativo, y la otra para depurar el código Java, como se indica con -java.
Figura 2. Pestaña para depurar código nativo y pestaña para depurar código Java
Nota: Si está depurando código nativo optimizado por el compilador, puede aparecer el siguiente mensaje de advertencia: This function was compiled with optimizations enabled. Some debugger features may not be available
. Cuando se utilizan banderas de optimización, como las banderas -O
, el compilador realiza cambios en su código compilado para que se ejecute de manera más eficiente. Esto puede hacer que el depurador reporte información inesperada o incorrecta porque es difícil para el depurador mapear el código compilado optimizado de vuelta al código fuente original. Por esta razón, debes desactivar las optimizaciones del compilador mientras depuras tu código nativo.
Usa el registro del sistema
El registro del sistema muestra los mensajes del sistema mientras depuras tu aplicación. Estos mensajes incluyeninformación de las apps que se ejecutan en el dispositivo. Si quieres utilizar el registro del sistema para depurar tu aplicación, asegúrate de que tu código escribe mensajes de registro e imprime el stacktrace de las excepciones mientras tu aplicación está en la fase de desarrollo.
Escribe mensajes de registro en tu código
Para escribir mensajes de registro en tu código, utiliza la clase Log
. Los mensajes de registro te ayudan a entender el flujo de ejecución recogiendo la salida de depuración del sistema mientras interactúas con tu aplicación. Los mensajes de registro pueden indicarte qué parte de tu aplicación ha fallado. Para obtener más información sobre el registro, consulte Escribir y ver registros.
El siguiente ejemplo muestra cómo podría agregar mensajes de registro para determinar si la información de estado anterior está disponible cuando se inicia su actividad:
Durante el desarrollo, su código también puede capturar excepciones y escribir el seguimiento de la pila en el systemlog:
Nota: Elimine los mensajes de registro de depuración y las llamadas de impresión de seguimiento de la pila de su código cuando esté listo para publicar su aplicación. Usted podría hacer esto mediante el establecimiento de un DEBUG
flag y la colocación de los mensajes de registro de depuración dentro de las declaraciones condicionales.
Ver el registro del sistema
Usted puede ver y filtrar la depuración y otros mensajes del sistema en la ventana Logcat. Por ejemplo, puede ver los mensajes cuando se produce la recolección de basura, o los mensajes que agrega a su aplicación con la clase Log
.
Para utilizar logcat, inicie la depuración y seleccione la pestaña Logcat en la barra de herramientas inferior, como se muestra en la figura 3.
Figura 3. Ventana de Logcat con la configuración de los filtros
Para obtener una descripción de logcat y sus opciones de filtrado, consulte Escribir y ver registros con Logcat.
Trabajar con puntos de interrupción
Android Studio admite varios tipos de puntos de interrupción que desencadenan diferentes acciones de depuración. El tipo más común es un punto de interrupción de línea que detiene la ejecución de su aplicación en una línea de código especificada. Mientras está en pausa, puedes examinar variables, evaluar expresiones y continuar la ejecución línea por línea para determinar las causas de los errores de ejecución.
Para añadir un punto de interrupción de línea, procede de la siguiente manera:
- Localiza la línea de código en la que deseas pausar la ejecución y, a continuación, haz clic en el canalón izquierdo a lo largo de esa línea de código o coloca el signo de intercalación en la línea y pulsa Control+F8 (en Mac, Comando+F8).
- Si tu aplicación ya se está ejecutando, no necesitas actualizarla para añadir el punto de interrupción; simplemente haz clic en Adjuntar depurador al proceso de Android . De lo contrario, inicie la depuración haciendo clic en Debug .
Figura 3. Aparece un punto rojo junto a la línea cuando se establece un punto de interrupción
Cuando la ejecución del código alcanza el punto de interrupción, Android Studio detiene la ejecución de la aplicación. A continuación, puedes utilizar las herramientas de la pestaña Depurador para identificar el estado de la aplicación:
-
Para examinar el árbol de objetos de una variable, expándela en la vista Variables. Si la vista de Variables no está visible, haga clic en Restaurar vista de Variables .
-
Para evaluar una expresión en el punto de ejecución actual, haga clic en Evaluar Expresión .
-
Para avanzar a la siguiente línea del código (sin introducir un método), haga clic en Pasar por encima .
-
Para avanzar a la primera línea dentro de una llamada a un método, haga clic en Step Into .
-
Para avanzar a la siguiente línea fuera del método actual, haga clic en Step Out .
-
Para continuar ejecutando la aplicación normalmente, haga clic en Resume Program .
Si tu proyecto utiliza algún código nativo, por defecto el tipo de depuración Auto adjunta tanto el depurador Java como el LLDB a tu app como dos procesos separados, por lo que puedes alternar entre la inspección de puntos de ruptura Java y C/C++ sin reiniciar tu app o cambiar la configuración.
Nota: Para que Android Studio detecte puntos de ruptura en tu código C o C++, necesitas utilizar un tipo de depuración que soporte LLDB, como Auto, Nativo o Dual. Puedes cambiar el tipo de depuración que utiliza Android Studio editando tu configuración de depuración. Para saber más sobre los diferentes tipos de depuración, lee la sección sobre el uso de otros tipos de depuración.
Cuando Android Studio despliega tu aplicación en el dispositivo de destino, la ventana de depuración se abre con una pestaña o vista de sesión de depuración para cada proceso de depuración, como se muestra en la figura 4.
Figura 4. Depuración de código nativo usando LLDB
- Android Studio cambia a la pestaña <su-módulo> cuando el depurador LLDB encuentra un punto de interrupción en su código C/C++. Los paneles Frames, Variables y Watches también están disponibles y funcionan exactamente igual que si estuvieras depurando código Java. Aunque el panel de hilos no está disponible en la vista de sesión de LLDB, puedes acceder a los procesos de tu aplicación utilizando la lista desplegable del panel de marcos. Puedes aprender más sobre estos paneles en las secciones sobre cómo depurar marcos de ventana e inspeccionar variables.
Nota: Mientras inspeccionas un punto de interrupción en tu código nativo, el sistema Android suspende la máquina virtual que ejecuta el bytecode Java de tu aplicación. Esto significa que no puedes interactuar con el depurador de Java ni recuperar ninguna información de estado de tu sesión del depurador de Java mientras inspeccionas un punto de interrupción en tu código nativo.
- Android Studio cambia a la pestaña <su módulo>-java cuando el depurador de Java encuentra un punto de interrupción en su código Java.
- Mientras que la depuración con LLDB, puede utilizar el terminal de LLDB en la vista de la sesión de LLDB para pasar opciones de línea de comandos a LLDB. Si tienes ciertos comandos que quieres que LLDB ejecute cada vez que inicies la depuración de tu aplicación, ya sea justo antes o justo después de que el depurador se conecte al proceso de tu aplicación, puedes añadir esos comandos a tu configuración de depuración.
Mientras depuras código C/C++, también puedes establecer tipos especiales de puntos de interrupción, llamados puntos de vigilancia, que pueden suspender el proceso de tu aplicación cuando ésta interactúa con un bloque de memoria en particular. Para obtener más información, lea la sección sobre cómo agregar puntos de control.
Ver y configurar puntos de interrupción
Para ver todos los puntos de interrupción y configurar los ajustes de los puntos de interrupción, haga clic en Ver puntos de interrupción en el lado izquierdo de la ventana de depuración. Aparece la ventana de puntos de interrupción, como se muestra en la figura 5.
Figura 5. La ventana de puntos de interrupción enumera todos los puntos de interrupción actuales e incluye la configuración del comportamiento de cada uno
La ventana de puntos de interrupción permite activar o desactivar cada punto de interrupción de la lista de la izquierda. Si un punto de interrupción está deshabilitado, Android Studio no pausa tu aplicación cuando llega a ese punto de interrupción. Seleccione un punto de interrupción de la lista para configurar sus ajustes. Puedes configurar un punto de interrupción para que esté deshabilitado al principio y que el sistema lo habilite después de que se alcance un punto de interrupción diferente. También puede configurar si un punto de interrupción debe ser desactivado después de ser golpeado. Para establecer un punto de interrupción para cualquier excepción, seleccione Puntos de interrupción de excepción en la lista de puntos de interrupción.
Marcos de la ventana de depuración
En la ventana del depurador, el panel Marcos le permite inspeccionar el marco de pila que causó el golpe del punto de interrupción actual. Esto le permite navegar y examinar el marco de la pila y también inspeccionar la lista de hilos en su aplicación Android. Para seleccionar un hilo, utilice el desplegable del selector de hilos y vea su marco de pila. Al hacer clic en los elementos del marco se abre la fuente en el editor. También puedes personalizar la presentación de los hilos y exportar el marco de la pila, tal y como se explica en la guía Marcos de la ventana.
Inspeccionar variables
En la ventana del depurador, el panel Variables te permite inspeccionar las variables cuando el sistema detiene tu aplicación en un punto de interrupción y seleccionas un marco del panel Marcos. El panel Variables también permite evaluar expresiones ad-hoc utilizando métodos estáticos y/o variables disponibles dentro del marco seleccionado.
El panel Vigilancias proporciona una funcionalidad similar, excepto que las expresiones añadidas al panel Vigilancias persisten entre sesiones de depuración. Debería añadir relojes para las variables y campos a los que accede con frecuencia o que proporcionan un estado que es útil para la sesión de depuración actual. Los paneles Variables y Vigilancias aparecen como se muestra en la figura 5.
Para añadir una variable o expresión a la lista de Vigilancias, siga estos pasos:
- Inicie la depuración.
- En el panel Watches, haga clic en Add .
- En el cuadro de texto que aparece, escriba el nombre de la variable o expresión que desea vigilar y luego presione Enter.
Para eliminar un elemento de la lista de Vigilancia, seleccione el elemento y luego haga clic en Eliminar .
Puede reordenar los elementos de la lista de Vigilancia seleccionando un elemento y luego haciendo clic en Subir o Bajar .
Figura 6. Los paneles Variables y Watches en la ventana del depurador
Añadir puntos de vigilancia
Mientras depuras código C/C++, puedes establecer tipos especiales de puntos de interrupción, llamados watchpoints, que pueden suspender el proceso de tu aplicación cuando ésta interactúa con un bloque de memoria concreto. Por ejemplo, si estableces dos punteros a un bloque de memoria y le asignas un punto de control, el uso de cualquiera de los punteros para acceder a ese bloque de memoria activa el punto de control.
En Android Studio, puedes crear un punto de control durante el tiempo de ejecución seleccionando una variable específica, pero LLDB asigna el punto de control sólo al bloque de memoria que el sistema asigna a esa variable, no a la propia variable. Esto es diferente de añadir una variable al panel Watches, que permite observar el valor de una variable pero no permite suspender el proceso de la aplicación cuando el sistema lee o cambia su valor en la memoria.
Nota: Cuando su proceso de aplicación sale de una función y el sistema desasigna sus variables locales de la memoria, debe reasignar cualquier punto de vigilancia que haya creado para esas variables.
Para establecer un punto de vigilancia, debe cumplir los siguientes requisitos:
- Su dispositivo físico o emulador de destino utiliza una CPU x86 o x86_64. Si su dispositivo utiliza una CPU ARM, entonces debe alinear el límite de la dirección de su variable en la memoria a 4 bytes para procesadores de 32 bits, u 8 bytes para procesadores de 64 bits. Puedes alinear una variable en tu código nativo especificando
__attribute__((aligned(num_bytes)))
en la desaceleración de la variable, como se muestra a continuación:// For a 64-bit ARM processorint my_counter __attribute__((aligned(8)));
- Ya has asignado tres o menos watchpoints. Android Studio sólo admite hasta cuatro watchpoints en dispositivos de destino x86 o x86_64. Otros dispositivos pueden soportar menos watchpoints.
Nota: Al depurar tu aplicación con ARM ABIs de 32 bits, añadir un watchpoint o pasar por encima de las variables dentro del código para investigar sus valores puede provocar un fallo. Como solución, por favor, depure utilizando binarios ARM de 64 bits, x86 o x86_64. Este problema se solucionará en una próxima versión de Android Studio.
Si cumples con los requisitos anteriores, puedes añadir un watchpoint de la siguiente manera:
- Mientras tu aplicación está suspendida en un breakpoint, navega al panel Variables en tu vista de sesión de LLDB.
-
Haga clic con el botón derecho del ratón en una variable que ocupe el bloque de memoria que desea rastrear y seleccione Add Watchpoint. Aparecerá un cuadro de diálogo para configurar su watchpoint, como se muestra en la figura 7.
Figura 7. Añadir un watchpoint a una variable en memoria
- Configure su watchpoint con las siguientes opciones:
- Activado: Puedes desmarcar esta opción si quieres decirle a Android Studio que ignore el watchpoint por el momento. Android Studio sigue guardando tu watchpoint para que puedas acceder a él más tarde en tu sesión de depuración.
- Suspender: Por defecto, el sistema Android suspende el proceso de tu app cuando accede a un bloque de memoria que asignas a un watchpoint. Puedes anular la selección de esta opción si no quieres este comportamiento; esto revela opciones adicionales que puedes utilizar para personalizar el comportamiento cuando el sistema interactúa con tu watchpoint: Registrar el mensaje en la consola y Eliminar cuando se golpea.
- Tipo de acceso: Seleccione si su aplicación debe desencadenar su watchpoint cuando intente Leer o Escribir en el bloque de memoria que el sistema asigna a la variable. Para activar su punto de vigilancia tanto en una lectura como en una escritura, seleccione Cualquiera.
- Haga clic en Listo.
Para ver todos sus puntos de control y configurar los ajustes de los puntos de control, haga clic en Ver puntos de interrupción en el lado izquierdo de la ventana de depuración. Aparece el diálogo de puntos de interrupción, como se muestra en la figura 8.
Figura 8. El diálogo de puntos de interrupción enumera sus puntos de control actuales e incluye la configuración del comportamiento de cada uno
Después de añadir su punto de control, haga clic en Reanudar programa en el lado izquierdo de la ventana de depuración para reanudar el proceso de su aplicación. Por defecto, si tu app intenta acceder a un bloque de memoria al que has establecido un watchpoint, el sistema Android suspende el proceso de tu app y aparece un icono de watchpoint junto a la línea de código que tu app ejecutó por última vez, como se muestra en la figura 9.
Figura 9. Android Studio indica la línea de código que ejecuta tu app justo antes de activar un watchpoint
Ver y cambiar el formato de visualización de los valores de los recursos
En el modo de depuración, puedes ver los valores de los recursos y seleccionar un formato de visualización diferente para las variables de tu código Java. Con la pestaña Variables desplegada y un marco seleccionado, haga lo siguiente:
- En la lista de Variables, haga clic con el botón derecho del ratón en cualquier lugar de una línea de recursos para mostrar la lista desplegable.
- En la lista desplegable, seleccione Ver como y seleccione el formato que desea utilizar.
Los formatos disponibles dependen del tipo de datos del recurso que haya seleccionado. Puede ver una o varias de las siguientes opciones:
- Clase: Mostrar la definición de la clase.
- toString: Mostrar el formato de cadena.
- Object: Mostrar la definición de objeto (una instancia de una clase).
- Array: Mostrar en un formato de matriz.
- Timestamp: Mostrar la fecha y la hora de la siguiente manera: aaaa-mm-dd hh:mm:ss.
- Auto: Android Studio elige el mejor formato basado en el tipo de datos.
- Binario: Muestra un valor binario usando ceros y unos.
- MeasureSpec: El valor pasado del padre al hijo seleccionado. Véase
MeasureSpec
. - Hex: Mostrar como un valor hexadecimal.
- Primitiva: Mostrar como un valor numérico utilizando un tipo de datos primitivo.
- Entero: Mostrar un valor numérico del tipo
Integer
.
Se puede crear un formato personalizado (renderizador de tipo de datos), como sigue: