Usa depuradores

En esta página, se detalla el uso de LLDB para el desarrollo de SO. Para el desarrollo de aplicaciones, consulta Cómo depurar tu app en su lugar, en la que se explica cómo usar la GUI de Android Studio (basada en LLDB).

Ya no se admite ni proporciona GDB. Si cambias de GDB a LLDB, deberías probablemente empieces por leer Instructivo de LLDB. Si eres un usuario experto de GDB, la Mapa de comandos de GDB a LLDB es muy útil durante la transición.

Requisitos previos

Para usar un depurador, sigue estos pasos:

  • Configura el entorno de compilación con el comando envsetup.sh habitual.
  • Ejecuta el mismo comando lunch que usaste cuando compilaste. Ten en cuenta que el plato del almuerzo debe coincidir exactamente con el dispositivo que estás depurando. Si el elemento del almuerzo no coincide con el dispositivo adjunto, recibirás un mensaje de error del siguiente formato: You used the wrong lunch: TARGET_PRODUCT (aosp_arm64) does not match attached device (xyzabc)
  • Conecta tu dispositivo a la máquina.

Para obtener más ayuda con la configuración de tu entorno, consulta Configura el entorno.

Depura un objeto binario

Para depurar un objeto binario que compilaste en tu máquina, primero debes copiarlo en el dispositivo y, luego, inicia el depurador. Por ejemplo:

adb push test.exe /data/local/tmp/test.exe
lldbclient.py --port 5038 -r /data/local/tmp/test.exe

Depura procesos o apps en ejecución

Para conectarte a una app en ejecución o un daemon nativo, usa lldbclient.py con un PID. Por ejemplo, para depurar el proceso con PID 1234, ejecuta esto en el host:

lldbclient.py -p 1234

La secuencia de comandos configura la redirección de puertos, inicia stub de depuración remota en el dispositivo, inicia el depurador en al host, lo configura para buscar símbolos y conecta en el stub de depuración remota.

Cómo depurar el inicio de un proceso nativo

Para depurar un proceso cuando se inicia, usa lldbclient.py con -r. de 12 a 1 con la nueva opción de compresión. Por ejemplo, para depurar ls /bin, ejecuta lo siguiente en el host:

lldbclient.py -r /system/bin/ls /bin

Luego, ingresa continue en el símbolo del sistema del depurador.

Cómo depurar el inicio de una app

Es posible que quieras depurar una app durante el inicio, por ejemplo, cuando se produce una falla. y quieres revisar el código para ver qué sucedió antes de la falla. Adjuntar funciona en algunos casos, pero en otros es imposible porque la aplicación falla antes de que puedas adjuntarla. El Enfoque de logwrapper (se usa para strace) no siempre funciona, ya que es posible que la app no tenga permisos para abrir un puerto, y lldbserver hereda ese restricción.

Para depurar el inicio de una app, usa las opciones para desarrolladores en Configuración para indicar que la app espere a que se adjunte un depurador de Java:

  1. Ve a Configuración > Opciones para desarrolladores > Selecciona la app de depuración y elige tu app en la lista y, luego, haz clic en Wait for debugger.
  2. Inicia la app, ya sea desde el selector o usando la línea de comandos para ejecutar lo siguiente:
    adb shell am start -a android.intent.action.MAIN -n APP_NAME/.APP_ACTIVITY
    
  3. Espera a que se cargue la app y aparezca un diálogo que indique que la app está a la espera de un depurador.
  4. Conecta lldbserver/lldbclient normalmente, configurado puntos de interrupción y, luego, continúa el proceso.

Para permitir que se ejecute la app, adjunta un Java Debug Wire Protocol (JDWP) como Java Debugger (jdb):

adb forward tcp:12345 jdwp:XXX  # (Where XXX is the PID
of the debugged process.)
jdb -attach localhost:12345

Cómo depurar apps o procesos que fallan

Si quieres que debuggerd suspenda los procesos con fallas para poder adjuntar un depurador, establece la propiedad adecuada:

  • Después de Android 11
    adb shell setprop debug.debuggerd.wait_for_debugger true
    
  • Android 11 y versiones anteriores
    adb shell setprop debug.debuggerd.wait_for_gdb true
    
  • Android 6.0 Marshmallow y versiones anteriores
    adb shell setprop debug.db.uid 999999
    

Al final del resultado habitual de la falla, debuggerd proporciona la función de copiar y pegar. Instrucciones en logcat que muestran cómo conectar el depurador al proceso con fallas

Depura con VS Code

LLDB admite la depuración del código de la plataforma en Visual Studio Code Puedes usar el frontend del depurador de VS Code en lugar de la interfaz de la CLI de LLDB para controlar y depurar el código nativo que se ejecuta en los dispositivos.

Antes de usar VS Code para la depuración, instala el CodeLLDB.

Para depurar el código con VS Code, haz lo siguiente:

  1. Asegúrate de que todos los artefactos de compilación (como los símbolos) necesarios para ejecutarse lldbclient.py o lldbclient.py están presentes.
  2. En VS Code, presiona Ctrl + Mayúsculas + P para ejecutar un comando. Busca Debug: Agregar configuración... y, luego, selecciona LLDB. Se abrirá un archivo launch.json y se agregará un objeto JSON nuevo a una lista.
  3. Reemplaza la configuración del depurador recientemente agregada por dos líneas de comentarios: // #lldbclient-generated-begin y // #lldbclient-generated-end, entonces que tu lista de configuración se ve así:
    "configurations": [
        // #lldbclient-generated-begin
        // #lldbclient-generated-end
    ]

    lldbclient.py usa estos comentarios para detectar dónde escribir la configuración. Si si hay otros elementos de la lista, agrega las líneas de comentarios al final después de las demás configuraciones.

  4. Ejecuta el siguiente comando en la terminal donde ejecutaste envsetup.sh y lunch
    lldbclient.py --setup-forwarding vscode-lldb \
          --vscode-launch-file LAUNCH_JSON_PATH \
          ANY_OTHER_FLAGS -p pid | -n proc-name | -r ...

    lldbclient.py escribe la configuración generada en launch.json y siga funcionando. Esta situación es esperable; no finalices el programa lldbclient.py. Si omite el --vscode-launch-file; la secuencia de comandos imprimirá el fragmento JSON que debes copiar y pegar manualmente en launch.json.

    La marca -r debe ser la última si está presente debido a cómo se analizan las marcas. la herramienta.

  5. Abre la barra lateral Run and Debug; la nueva configuración debería aparecer en el depurador. Presiona Iniciar depuración (F5). El depurador debería conectarse después de 10 a 30 segundos.

    Si no aparece la configuración nueva en la vista Run and Debug, vuelve a cargar la ventana para Actualiza la lista del depurador. Presiona Ctrl+Shift+P y escribe reload window

  6. Cuando termines la depuración, ve a la terminal lldbclient.py y presiona Intro para finalizar la lldbclient.py. Las ejecuciones posteriores de la secuencia de comandos generarían la configuración. entre los comentarios de #lldbclient-generated y reemplaza el contenido antiguo, necesitas quitarlos manualmente.

Para agregar propiedades personalizadas a la configuración de lanzamiento generada, puedes usar el --vscode-launch-props. Por ejemplo:

lldbclient.py --setup-forwarding vscode-lldb \
    --vscode-launch-props \
    '{"initCommands" : ["script print(\"Hello\")"], "preLaunchTask" : "Build"}' \
    ...
Las propiedades de ejemplo harían que VS Code ejecute una tarea llamada Build antes de la depuración y agrega un nuevo paso de inicialización de depuración a los pasos que genera la secuencia de comandos. Puedes encontrar de las propiedades disponibles en la documentación de VS Code y el Manual de instrucciones de la CodeLLDB.