Depura el código de la plataforma

Android Studio for Platform (ASfP) integra la depuración de la plataforma en varios idiomas en la pestaña Attach de la ventana de herramientas Debug:

  • Selecciona Run > Attach to Android Process (Control+Alt+A) para adjuntar el depurador de Java, el depurador nativo (LLDB incluido) o ambos a cualquier app o proceso del sistema en ejecución en un dispositivo físico o en un dispositivo virtual de Cuttlefish.
  • Inspecciona cada biblioteca compartida cargada (.so) y su ID de compilación ELF de ocho caracteres en el panel Libraries antes de adjuntarla. Los íconos de marca de verificación verifican que coincidan los símbolos de depuración locales en out/target/product/<device>/symbols.
  • Administra los requisitos previos del dispositivo desde la barra de herramientas: filtra con Mostrar procesos del sistema, haz clic en Dispositivo con permisos de administrador para ejecutar adb root (se mostrará El dispositivo tiene permisos de administrador cuando esté activo) y haz clic en Habilitar JDWP para habilitar JDWP en compilaciones de userdebug.
  • Establece puntos de interrupción condicionales y de excepción, consulta los valores de las variables intercaladas en el editor, usa Drop Frame y Step Into inteligentes, y, además, inspecciona los tipos estructurados de C++ y Rust en el tiempo de ejecución.

Antes de usar el depurador, compila tu destino lunch para que exista el índice de símbolos out/target/product/<device>/symbols/.build-id local y, luego, escribe en la memoria flash o inicia una imagen de dispositivo coincidente.

Depuración de Java y depuración dual de Java y código nativo

Para depurar una aplicación de Java o Kotlin, una app del sistema (como com.android.messaging, Configuración o SystemUI) o un proceso que llama a código de JNI y C++ o Rust, completa los siguientes pasos:

  1. Establece puntos de interrupción en tus archivos fuente de Java, Kotlin, C, C++ o Rust.
  2. Selecciona Run > Attach to Android Process (Control+Alt+A). ASfP abre una pestaña Adjuntar fijada dentro de la ventana de herramientas Depurar.
  3. Selecciona tu dispositivo de destino en el menú desplegable de dispositivos. Si JDWP no está habilitado en una compilación de userdebug, haz clic en Habilitar JDWP. ASfP establece persist.debug.dalvik.vm.jdwp.enabled=1 y reinicia el dispositivo. Cuando está activo, el botón muestra JDWP habilitado con una acción de hacer clic con el botón derecho Inhabilitar JDWP.
  4. Selecciona el proceso de destino en la tabla (los procesos de Java y ART muestran un ícono de taza de café).
  5. En la parte inferior de la pestaña Adjuntar, selecciona Depurador de Java, Depurador nativo o ambos. Si seleccionas ambas, se abrirán dos pestañas vinculadas en la ventana de herramientas Debug: <process> (<pid>) para LLDB integrado y <process> (<pid>)-jdwp para Java. Sus ciclos de vida están vinculados, por lo que detener cualquiera de las sesiones detiene ambas.
  6. Haz clic en Adjuntar e interactúa con la app en tu dispositivo para alcanzar los puntos de interrupción.

Pestañas de depuración duales de Java y nativas vinculadas junto a la pestaña Adjuntar

Depuración de procesos del sistema (C y C++) y verificación de símbolos

Para depurar daemons del sistema, HAL o servicios del sistema (como android.hardware.bluetooth-service.cuttlefish, surfaceflinger o audioserver), completa los siguientes pasos:

  1. Abre Ejecutar > Adjuntar al proceso de Android (Control+Alt+A). Si la barra de herramientas muestra Root Device, haz clic en ella para que ASfP ejecute adb root y muestre Device is rooted.
  2. Selecciona Mostrar procesos del sistema en la barra de herramientas superior y filtra el proceso objetivo.
  3. Verifica los símbolos de depuración locales en el panel Libraries: Cuando seleccionas un proceso, se completa la tabla Libraries con cada biblioteca compartida ELF (.so) cargada en el proceso y los primeros ocho caracteres hexadecimales de su ID de compilación ELF. ASfP compara cada ID de compilación con out/target/product/<device>/symbols (se requiere symbols/.build-id para resolver bibliotecas dentro de APEX):
    • Las bibliotecas verificadas muestran un ícono de marca de verificación. Apunta a cualquier fila resuelta para obtener una vista previa de la ruta de acceso completa al símbolo .debug local.
    • Las bibliotecas sin resolver que no tienen símbolos locales coincidentes muestran un ícono de advertencia.
  4. Detección de procesos que no son de Java: Cuando seleccionas un proceso de C++ o Rust (marcado con un ícono de hexágono C), ASfP oculta Java debugger y muestra Java debugging unavailable, not a Java process., mientras mantiene marcada la opción Native debugger.
  5. Establece puntos de interrupción en tus archivos fuente de C, C++ o Rust, haz clic en Adjuntar y activa las instrucciones de código en el dispositivo.

Pestaña Adjuntar que muestra la tabla de bibliotecas, los IDs de compilación de ELF y las marcas de verificación de símbolos locales

Depura código de Rust

ASfP depura el código de la plataforma Rust con el mismo depurador LLDB integrado que se usa para C y C++. No se requiere ningún adaptador externo ni configuración manual del servidor: ASfP usa lldb-dap de su cadena de herramientas incluida y carga automáticamente los Pretty Printers de Rust desde tus compilaciones previas de AOSP para que los tipos estándar, como String, Vec, HashMap y Option, muestren valores estructurados en el panel Variables.

Cómo adjuntar el depurador a un proceso de Rust en ejecución en un dispositivo

Sigue los pasos que se indican en Depuración de procesos del sistema (C y C++): Abre Run > Attach to Android Process, verifica que Device is rooted y que los símbolos locales muestren una marca de verificación en el panel Libraries, mantén marcada la opción Native debugger y haz clic en Attach. Los marcos de pila de Rust y C o C++ aparecen juntos en la misma sesión de depuración.

Depura un módulo rust_test o rust_test_host

  1. Abre el archivo Android.bp que declara un destino rust_test o rust_test_host y haz clic en el ícono Ejecutar en el margen junto al tipo de módulo.
  2. Selecciona Debug '<ModuleName>'. ASfP compila el destino, inicia el archivo binario de prueba en LLDB en tu máquina host o dispositivo conectado y se detiene en tus puntos de interrupción de Rust.
  3. Para depurar una sola función de prueba o personalizar los comandos de inicio de LLDB, abre Run > Edit Configurations, selecciona la configuración Soong Test generada y establece Method o expande las opciones de Debugger. Para obtener más información sobre las opciones de configuración de Soong Test, consulta Prueba el código de la plataforma con atest.

Depuración del código de la plataforma Rust con visualizadores de variables estructuradas en ASfP