Esta página detalla el uso de LLDB o GDB para el desarrollo del sistema operativo. Para el desarrollo de aplicaciones, consulte Depurar su aplicación , que explica cómo usar la GUI de Android Studio (basada en LLDB).
GDB está en desuso y se eliminará pronto. 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 usar un depurador:
- Configure el entorno de compilación con el comando habitual
envsetup.sh
. - Ejecute el mismo comando de
lunch
que usó al construir.
Para obtener más ayuda con la configuración de su entorno, consulte Configuración del entorno .
Depuración de aplicaciones o procesos en ejecución
Para conectarse a una aplicación en ejecución o un demonio nativo, use gdbclient.py
con un PID. Por ejemplo, para depurar el proceso con PID 1234, ejecute esto en el host:
gdbclient.py -p 1234
El script configura el reenvío de puertos, inicia el código auxiliar de depuración remota adecuado en el dispositivo, inicia el depurador en el host, lo configura para encontrar 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 comienza, use gdbclient.py
con la opción -r
. Por ejemplo, para depurar ls /bin
, ejecute esto en el host:
gdbclient.py -r /system/bin/ls /bin
Luego, ingrese continue
en el indicador del depurador.
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 casos es imposible porque la aplicación falla antes de que puedas adjuntarla. El enfoque logwrapper
(usado para strace
) no siempre funciona porque la aplicación podría no tener permisos para abrir un puerto y gdbserver
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:
- 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 .
- Inicie la aplicación, ya sea desde el lanzador o usando la línea de comando para ejecutar:
adb shell am start -a android.intent.action.MAIN -n APP_NAME/.APP_ACTIVITY
- Espere a que se cargue la aplicación y que aparezca un cuadro de diálogo que le indica que la aplicación está esperando un depurador.
- Adjunte
gdbserver
/gdbclient
normalmente, establezca puntos de interrupción y luego continúe con el proceso.
Para permitir que la aplicación se ejecute, adjunte un depurador de 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
Depuración de aplicaciones o procesos que fallan
Si desea que debuggerd
suspenda los procesos bloqueados para que pueda adjuntar un depurador, establezca la propiedad adecuada:
- Después de Android 11
adb shell setprop debug.debuggerd.wait_for_debugger true
- Android 11 y
adb shell setprop debug.debuggerd.wait_for_gdb true
- Android 6.0 Marshmallow e inferior
adb shell setprop debug.db.uid 999999
Al final de la salida habitual del bloqueo, debuggerd
proporciona instrucciones para copiar y pegar en logcat que muestran cómo conectar el depurador al proceso bloqueado.
Depuración sin símbolos
Para ARM de 32 bits, si no tiene símbolos, gdb
no puede determinar qué conjunto de instrucciones está desarmando (ARM o Thumb). Para especificar el conjunto de instrucciones elegido como predeterminado cuando falta la información del símbolo, establezca la siguiente propiedad:
set arm fallback-mode arm # or thumb
Depuración con VS Code
LLDB admite código de plataforma de depuración en Visual Studio Code . Puede usar la interfaz 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, instale la extensión CodeLLDB .
Para depurar código usando VS Code:
- Asegúrese de que estén presentes todos los artefactos de compilación (como símbolos) necesarios para ejecutar
gdbclient.py
olldbclient.py
. - Ejecute el siguiente comando:
lldbclient.py --setup-forwarding vscode-lldb ANY_OTHER_FLAGS -p pid | -n proc-name | -r ...
Esto imprime un objeto JSON y
lldbclient.py
continúa ejecutándose. Esto se espera; no elimine el programalldbclient.py
.El indicador
-r
debe ser el último indicador si está presente debido a cómo la herramienta analiza los indicadores. - En la pestaña de depuración en VS Code, seleccione agregar configuración , luego seleccione LLDB: Inicio personalizado . Esto abre un archivo
launch.json
y agrega un nuevo objeto JSON a una lista. - Elimine la configuración del depurador recién agregada.
- Copie el objeto JSON impreso por
lldbclient.py
y péguelo en el objeto que acaba de eliminar. Guarde los cambios. - Para volver a cargar la ventana para actualizar la lista de depuradores, presione Ctrl+Shift+P y escriba
reload window
. - Seleccione la nueva configuración del depurador y presione ejecutar . El depurador debe conectarse después de 10 a 30 segundos.
- Cuando termine de depurar, vaya a la terminal que ejecuta
lldbclient.py
y presione Entrar para finalizar el programalldbclient.py
.