Google is committed to advancing racial equity for Black communities. See how.
Se usó la API de Cloud Translation para traducir esta página.
Switch to English

Usar depuradores

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).

Prerrequisitos

Para usar un depurador:

  • Configure el entorno de compilación con el comando envsetup.sh habitual.
  • Ejecute el mismo comando de lunch que utilizó al construir.

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

Depurar 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:

gdbclient.py -p 1234

El script configura el reenvío de puertos, inicia el código auxiliar de depuración remoto 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.

Depurar el inicio del proceso nativo

Para depurar un proceso cuando se inicia, use gdbserver o gdbserver64 . Para un ejecutable de 64 bits:

adb shell gdbserver64 :5039 /system/bin/MY_TEST_64_BIT_APP

Para un ejecutable de 32 bits:

adb shell gdbserver :5039 /system/bin/MY_TEST_32_BIT_APP

Salida de ejemplo:

Process MY_TEST_64_BIT_APP created; pid = 3460
Listening on port 5039

A continuación, identifique el PID de la aplicación de la salida de gdbserver y utilícelo en otra ventana de terminal:

gdbclient.py -p APP_PID

Finalmente, ingrese continue en el indicador de gdb .

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 se bloquea antes de que puedas adjuntar. El enfoque de 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:

  1. Vaya a Configuración> Opciones de desarrollador> Seleccione la 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 lanzador 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 la aplicación se cargue y aparezca un cuadro de diálogo que le indica que la aplicación está esperando un depurador.
  4. 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 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 gdb , establezca la propiedad adecuada:

  • Android 7.0 Nougat y superior
    
    adb shell setprop debug.debuggerd.wait_for_gdb true
    
  • Android 6.0 Marshmallow y versiones inferiores
    adb shell setprop debug.db.uid 999999
    

Al final de la salida de bloqueo habitual, debuggerd proporciona instrucciones sobre cómo conectar gdb usando el comando:

gdbclient.py -p PID

Depurar sin símbolos

Para ARM de 32 bits, si no tiene símbolos, gdb no puede determinar qué conjunto de instrucciones está desensamblando (ARM o Thumb). Para especificar el conjunto de instrucciones elegido como predeterminado cuando falta información del símbolo, establezca la siguiente propiedad:

set arm fallback-mode arm  # or thumb

Depurar con VS Code

GDB admite la depuración del código de la plataforma en Visual Studio Code . Puede usar la interfaz del depurador de VS Code en lugar de la interfaz CLI de GDB 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 C / C ++ .

Para depurar código usando VS Code:

  1. Asegúrese de que estén presentes todos los artefactos de compilación (como los símbolos) necesarios para ejecutar gdbclient.py .
  2. Ejecute el siguiente comando:
    gdbclient.py -p pid | -n proc-name |
    -r ... --setup-forwarding vscode ANY_OTHER_FLAGS

    Esto imprime un objeto JSON y gdbclient.py continúa ejecutándose. Se espera esto; no mates el programa gdbclient.py .

  3. En la pestaña de depuración en VS Code, seleccione agregar configuración , luego seleccione C / C ++ gdb adjuntar . Esto abre un archivo launch.json y agrega un nuevo objeto JSON a una lista.
  4. Elimina la configuración del depurador recién agregada.
  5. Copie el objeto JSON impreso por gdbclient.py y péguelo en el objeto que acaba de eliminar. Guarde los cambios.
  6. Para recargar la ventana para actualizar la lista del depurador, presione Ctrl + Shift + P y escriba reload window .
  7. Seleccione la nueva configuración del depurador y presione ejecutar . El depurador debería conectarse después de 10 a 30 segundos.
  8. Cuando hayas terminado de depurar, ve a la terminal que ejecuta gdbclient.py y presiona Enter para finalizar el programa gdbclient.py .

Después de configurar la configuración del depurador por primera vez, puede omitir los pasos 3 a 6.