Usar depuradores

Esta página detalha usando o LLDB (link em inglês) para desenvolvimento de SO. Para desenvolvimento de apps, consulte Depurar seu app que explica como usar a GUI do Android Studio (baseada no LLDB).

O GDB não é mais compatível nem fornecido. Se você está mudando do GDB para o LLDB, recomendamos provavelmente comece lendo Tutorial do LLDB. Se você é um usuário especialista do GDB, o Mapa de comandos do GDB para o LLDB é muito útil durante a transição.

Pré-requisitos

Para usar um depurador:

  • Configure o ambiente de build com o comando envsetup.sh normal.
  • Execute o mesmo comando lunch que você usou na criação. Observe que o item de almoço devem corresponder exatamente ao dispositivo que você está depurando. Se o item de almoço não corresponder ao dispositivo anexado, você receberá um erro do formulário: You used the wrong lunch: TARGET_PRODUCT (aosp_arm64) does not match attached device (xyzabc)
  • Conecte seu dispositivo à máquina.

Para mais ajuda com a configuração do ambiente, consulte Configure o ambiente.

Depurar um binário

Para depurar um binário criado na sua máquina, primeiro copie o binário para o dispositivo. e, em seguida, inicie o depurador. Exemplo:

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

Depurar apps ou processos em execução

Para se conectar a um app em execução ou daemon nativo, use lldbclient.py com um PID. Por exemplo, para depurar o processo com PID 1234, execute isto no host:

lldbclient.py -p 1234

O script configura o encaminhamento de portas e inicia stub de depuração remota no dispositivo, inicia o depurador em o host, o configura para encontrar símbolos e o conecta ao stub de depuração remota.

Depurar a inicialização do processo nativo

Para depurar um processo quando ele é iniciado, use lldbclient.py com o -r. é a melhor opção. Por exemplo, para depurar ls /bin, execute o seguinte comando no host:

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

Em seguida, digite continue no prompt do depurador.

Depurar inicialização do app

Às vezes, você quer depurar um app assim que ele é iniciado, por exemplo, quando há uma falha e você quiser analisar o código para ver o que aconteceu antes da falha. Anexar funciona em alguns casos, mas, em outros, impossível porque o aplicativo falha antes da anexação. A Abordagem logwrapper (usada para strace) nem sempre funciona porque o app pode não ter para abrir uma porta, e lldbserver herda essa e a segunda é a restrição de recursos.

Para depurar a inicialização do app, use as opções do desenvolvedor nas Configurações para instruir o app aguardar a anexação de um depurador Java:

  1. Acesse Configurações > Opções do desenvolvedor > Selecione o app de depuração e escolha seu app na lista e clique em Espere pelo depurador.
  2. Inicie o app pelo acesso rápido ou usando a linha de comando para executar:
    adb shell am start -a android.intent.action.MAIN -n APP_NAME/.APP_ACTIVITY
    
  3. Aguarde o app carregar e uma caixa de diálogo aparecer informando que ele está aguardando um depurador.
  4. Anexe lldbserver/lldbclient normalmente, defina e continue o processo.

Para permitir que o app seja executado, anexe um protocolo de depuração Java com fio (JDWP, na sigla em inglês). Depurador como o Java Debugger (jdb):

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

Depurar apps ou processos com falhas

Se quiser que o debuggerd suspenda processos com falha para que você possa anexar um depurador, defina a propriedade adequada:

  • Depois do Android 11
    adb shell setprop debug.debuggerd.wait_for_debugger true
    
  • Android 11 e versões anteriores
    adb shell setprop debug.debuggerd.wait_for_gdb true
    
  • Android 6.0 Marshmallow e anterior
    adb shell setprop debug.db.uid 999999
    

Ao final da saída de falha normal, o debuggerd fornece o recurso de copiar e colar. instruções no logcat mostrando como conectar o depurador ao processo com falha.

Depurar com o VS Code

O LLDB oferece suporte à depuração de código de plataforma em Visual Studio Code (link em inglês). É possível usar o front-end do depurador do VS Code em vez da interface da CLI do LLDB para controlar e depurar código nativo em execução nos dispositivos.

Antes de usar o VS Code para depuração, instale o Extensão CodeLLDB.

Para depurar o código usando o VS Code:

  1. Verifique se todos os artefatos de build (como símbolos) são necessários para execução lldbclient.py ou lldbclient.py estão presentes.
  2. No VS Code, pressione Ctrl+Shift+P para executar um comando e pesquise Debug: Adicionar configuração... e selecionar LLDB. Isso abre um arquivo launch.json e adiciona um novo objeto JSON a uma lista.
  3. Substitua a configuração do depurador recém-adicionada por duas linhas de comentários: // #lldbclient-generated-begin e // #lldbclient-generated-end, portanto, a lista de configuração deve ficar assim:
    "configurations": [
        // #lldbclient-generated-begin
        // #lldbclient-generated-end
    ]

    O lldbclient.py usa esses comentários para detectar onde gravar a configuração. Se houver outros itens na lista, adicione as linhas de comentários ao final, após as outras configurações.

  4. Execute o comando a seguir no terminal em que você executa envsetup.sh e lunch:
    lldbclient.py --setup-forwarding vscode-lldb \
          --vscode-launch-file LAUNCH_JSON_PATH \
          ANY_OTHER_FLAGS -p pid | -n proc-name | -r ...

    lldbclient.py grava a configuração gerada em launch.json e continua em execução. Isso já é esperado. Não encerre o programa lldbclient.py. Se você omitir o --vscode-launch-file. O script vai imprimir o snippet JSON que você precisa copiar e colar manualmente no launch.json.

    A flag -r precisa ser a última, se estiver presente, devido à forma como as sinalizações são analisadas. pela ferramenta.

  5. Abra a barra lateral Run and Debug. A nova configuração deve aparecer na lista de depuradores. Pressione Iniciar depuração (F5). O depurador será conectado depois de 10 a 30 segundos.

    Se a nova configuração não aparecer na visualização "Run and Debug", atualize a janela para: Atualize a lista de depuradores: pressione Ctrl+Shift+P e digite reload window

  6. Quando terminar a depuração, acesse o terminal em execução. lldbclient.py e pressione Enter para finalizar a lldbclient.py. As execuções subsequentes do script gerariam a configuração entre os comentários #lldbclient-generated e substituir o conteúdo antigo, você não precisará removê-los manualmente.

Para adicionar propriedades personalizadas à configuração de inicialização gerada, use o sinalização --vscode-launch-props. Por exemplo:

lldbclient.py --setup-forwarding vscode-lldb \
    --vscode-launch-props \
    '{"initCommands" : ["script print(\"Hello\")"], "preLaunchTask" : "Build"}' \
    ...
As propriedades do exemplo fariam o VS Code executar uma tarefa chamada Build antes de depurar e anexa uma nova etapa de inicialização de depuração às etapas geradas pelo script. É possível encontrar um informações gerais das propriedades disponíveis no na documentação do VS Code e no manual do usuário Extensão CodeLLDB.