Uso de depuradores

Esta página detalla el uso de LLDB para el desarrollo de sistemas operativos. Para el desarrollo de aplicaciones, consulte Depurar su aplicación , que explica cómo usar la GUI de Android Studio (basada en LLDB).

GDB ya no es compatible ni se proporciona. Si está cambiando de GDB a LLDB, probablemente debería comenzar leyendo el Tutorial de LLDB . Si es un usuario experto de GDB, el mapa de comandos de GDB a LLDB es muy útil durante la transición.

Requisitos previos

Para utilizar un depurador:

  • Configure el entorno de compilación con el comando habitual envsetup.sh .
  • Ejecute el mismo comando lunch que utilizó al compilar. Tenga en cuenta que el artículo del almuerzo debe coincidir exactamente con el dispositivo que está depurando. Si el artículo del almuerzo no coincide con el dispositivo adjunto, recibirá un error del tipo: You used the wrong lunch: TARGET_PRODUCT (aosp_arm64) does not match attached device (xyzabc)
  • Conecte su dispositivo a la máquina.

Para obtener más ayuda con la configuración de su entorno, consulte Configurar el entorno .

Depurando un binario

Para depurar un binario que creó en su máquina, primero deberá copiar el binario en el dispositivo y luego iniciar el depurador. Por ejemplo:

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

Depuración de aplicaciones o procesos en ejecución

Para conectarse a una aplicación en ejecución o un demonio nativo, use lldbclient.py con un PID. Por ejemplo, para depurar el proceso con PID 1234, ejecute esto en el host:

lldbclient.py -p 1234

El script configura el reenvío de puertos, inicia el código auxiliar de depuración remota apropiado en el dispositivo, inicia el depurador en el host, lo configura para buscar símbolos y lo conecta al código auxiliar de depuración remota.

Depuración del inicio del proceso nativo

Para depurar un proceso cuando se inicia, use lldbclient.py con la opción -r . Por ejemplo, para depurar ls /bin , ejecute esto en el host:

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

Luego, ingrese continue cuando el depurador lo solicite.

Inicio de la aplicación de depuración

A veces desea depurar una aplicación cuando se inicia, como cuando hay un bloqueo y desea revisar el código para ver qué sucedió antes del bloqueo. Adjuntar funciona en algunos casos, pero en otros es imposible porque la aplicación falla antes de que puedas adjuntar. El enfoque logwrapper (usado para strace ) no siempre funciona porque es posible que la aplicación no tenga permisos para abrir un puerto y lldbserver hereda esa restricción.

Para depurar el inicio de la aplicación, use las opciones de desarrollador en Configuración para indicarle a la aplicación que espere a que se adjunte un depurador de Java:

  1. Vaya a Configuración > Opciones de desarrollador > Seleccionar aplicación de depuración y elija su aplicación de la lista, luego haga clic en Esperar al depurador .
  2. Inicie la aplicación, ya sea desde el iniciador o usando la línea de comando para ejecutar:
    adb shell am start -a android.intent.action.MAIN -n APP_NAME/.APP_ACTIVITY
    
  3. Espere a que se cargue la aplicación y aparezca un cuadro de diálogo que le indica que la aplicación está esperando un depurador.
  4. Adjunte lldbserver / lldbclient normalmente, establezca puntos de interrupción y luego continúe el proceso.

Para permitir que la aplicación se ejecute, adjunte un depurador 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

Depurar aplicaciones o procesos que fallan

Si desea que debuggerd suspenda los procesos bloqueados para poder adjuntar un depurador, establezca 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 del fallo, debuggerd proporciona instrucciones para copiar y pegar en logcat que muestran cómo conectar el depurador al proceso bloqueado.

Depuración con código VS

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

Antes de usar VS Code para depurar, instale la extensión CodeLLDB .

Para depurar código usando VS Code:

  1. Asegúrese de que todos los artefactos de compilación (como símbolos) necesarios para ejecutar lldbclient.py o lldbclient.py estén presentes.
  2. En VS Code, presione Ctrl+Shift+P para ejecutar un comando, busque Depurar: Agregar configuración... y luego seleccione LLDB . Esto abre un archivo launch.json y agrega un nuevo objeto JSON a una lista.
  3. Reemplace la configuración del depurador recién agregada con dos líneas de comentarios: // #lldbclient-generated-begin y // #lldbclient-generated-end , para que su lista de configuración se vea así:
    "configurations": [
        // #lldbclient-generated-begin
        // #lldbclient-generated-end
    ]

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

  4. Ejecute el siguiente comando en la terminal donde ejecutó 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 continúa ejecutándose. Esto es de esperar; No elimine el programa lldbclient.py . Si omite el --vscode-launch-file el script imprimirá el fragmento JSON que deberá copiar y pegar en launch.json manualmente.

    El indicador -r debe ser el último indicador si está presente debido a cómo la herramienta analiza los indicadores.

  5. Abra la barra lateral Ejecutar y depurar ; la nueva configuración debería aparecer en la lista del depurador. Presione Iniciar depuración (F5) . El depurador debería conectarse después de 10 a 30 segundos.

    Si la nueva configuración no apareció en la vista Ejecutar y Depurar, vuelva a cargar la ventana para actualizar la lista del depurador: presione Ctrl+Shift+P y escriba reload window .

  6. Cuando haya terminado de depurar, vaya a la terminal que ejecuta lldbclient.py y presione Entrar para finalizar el programa lldbclient.py . Las ejecuciones posteriores del script generarán la configuración entre los comentarios #lldbclient-generated y reemplazarán los contenidos antiguos; no es necesario eliminarlos manualmente.

Para agregar propiedades personalizadas a la configuración de inicio generada, puede usar el indicador --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 agregue un nuevo paso de inicialización de depuración a los pasos generados por el script. Puede encontrar una descripción general de las propiedades disponibles en la documentación de VS Code y en el Manual de usuario de la extensión CodeLLDB .