Usando depuradores

Esta página detalha o uso de LLDB ou GDB para desenvolvimento de sistema operacional. Para desenvolvimento de aplicativos, consulte Depurar seu aplicativo , que explica como usar a GUI do Android Studio (baseada em LLDB).

O GDB está obsoleto e será removido em breve. Se você estiver mudando de GDB para LLDB, provavelmente deve começar lendo o Tutorial LLDB . Se você for um usuário especialista em GDB, o mapa de comandos GDB para LLDB é muito útil durante a transição.

Pré-requisitos

Para usar um depurador:

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

Para obter mais ajuda para configurar seu ambiente, consulte Configurar ambiente .

Depurando um binário

Para depurar um binário que você construiu em sua máquina, primeiro você terá que copiar o binário para o dispositivo e, em seguida, iniciar o depurador. Por exemplo:

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

Depuração de aplicativos ou processos em execução

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

gdbclient.py -p 1234

O script configura o encaminhamento de porta, inicia o stub de depuração remota apropriado no dispositivo, inicia o depurador no host, configura-o para localizar símbolos e conecta-o ao stub de depuração remota.

Depurando a inicialização do processo nativo

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

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

Em seguida, digite continue no prompt do depurador.

Inicialização do aplicativo de depuração

Às vezes, você deseja depurar um aplicativo quando ele é iniciado, como quando ocorre uma falha e você deseja percorrer o código para ver o que aconteceu antes da falha. Anexar funciona em alguns casos, mas em outros casos é impossível porque o aplicativo trava antes que você possa anexar. A abordagem logwrapper (usada para strace ) nem sempre funciona porque o aplicativo pode não ter permissões para abrir uma porta e gdbserver herda essa restrição.

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

  1. Vá para Configurações > Opções do desenvolvedor > Selecionar aplicativo de depuração e escolha seu aplicativo na lista e clique em Aguardar depurador .
  2. Inicie o aplicativo a partir do iniciador ou usando a linha de comando para executar:
    adb shell am start -a android.intent.action.MAIN -n APP_NAME/.APP_ACTIVITY
    
  3. Aguarde até que o aplicativo carregue e apareça uma caixa de diálogo informando que o aplicativo está aguardando um depurador.
  4. Anexe gdbserver / gdbclient normalmente, defina pontos de interrupção e continue o processo.

Para permitir a execução do aplicativo, anexe um depurador Java Debug Wire Protocol (JDWP), como o Java Debugger (jdb):

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

Depuração de aplicativos ou processos que travam

Se você deseja que debuggerd suspenda os processos travados para que você possa anexar um depurador, defina a propriedade apropriada:

  • Depois do Android 11
    adb shell setprop debug.debuggerd.wait_for_debugger true
    
  • Android 11 e inferior
    adb shell setprop debug.debuggerd.wait_for_gdb true
    
  • Android 6.0 Marshmallow e inferior
    adb shell setprop debug.db.uid 999999
    

No final da saída de travamento normal, debuggerd fornece instruções de copiar e colar no logcat mostrando como conectar o depurador ao processo travado.

Depuração sem símbolos

Para ARM de 32 bits, se você não tiver símbolos, gdb não pode determinar qual conjunto de instruções está desmontando (ARM ou Thumb). Para especificar o conjunto de instruções escolhido como padrão quando as informações do símbolo estão ausentes, defina a seguinte propriedade:

set arm fallback-mode arm  # or thumb

Depurando com VS Code

O LLDB oferece suporte à depuração do código da plataforma no Visual Studio Code . Você pode usar o front-end do depurador do VS Code em vez da interface LLDB CLI para controlar e depurar o código nativo em execução nos dispositivos.

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

Para depurar o código usando o VS Code:

  1. Certifique-se de que todos os artefatos de construção (como símbolos) necessários para executar gdbclient.py ou lldbclient.py estejam presentes.
  2. No VS Code, pressione Ctrl+Shift+P para executar um comando, procure Debug: Add Configuration... e selecione 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-adicionado por duas linhas de comentário - // #lldbclient-generated-begin e // #lldbclient-generated-end , para que sua lista de configuração fique assim:
    "configurations": [
        // #lldbclient-generated-begin
        // #lldbclient-generated-end
    ]

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

  4. Execute o seguinte comando no terminal onde você executou 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 é esperado; não mate o programa lldbclient.py . Se você omitir --vscode-launch-file o script imprimirá o snippet JSON que você precisará copiar e colar manualmente no launch.json .

    O sinalizador -r deve ser o último sinalizador se estiver presente devido à forma como os sinalizadores são analisados ​​pela ferramenta.

  5. Abra a barra lateral Executar e Depurar - a nova configuração deve aparecer na lista de depuradores. Pressione Iniciar Depuração (F5) . O depurador deve se conectar após 10 a 30 segundos.

    Se a nova configuração não aparecer na visualização Executar e Depurar, recarregue a janela para atualizar a lista de depuradores - pressione Ctrl+Shift+P e digite reload window .

  6. Quando terminar a depuração, vá para o terminal executando lldbclient.py e pressione Enter para encerrar o programa lldbclient.py . As execuções subsequentes do script gerariam a configuração entre os comentários #lldbclient-generated e substituiriam o conteúdo antigo, não é necessário removê-los manualmente.

Para adicionar propriedades personalizadas à configuração de inicialização gerada, você pode usar o sinalizador --vscode-launch-props . Por exemplo:

lldbclient.py --setup-forwarding vscode-lldb \
    --vscode-launch-props \
    '{"initCommands" : ["script print(\"Hello\")"], "preLaunchTask" : "Build"}' \
    ...
As propriedades de exemplo fariam o VS Code executar uma tarefa chamada Build antes da depuração e anexariam uma nova etapa de inicialização de depuração às etapas geradas pelo script. Você pode encontrar uma visão geral das propriedades disponíveis na documentação do VS Code e no Manual do Usuário da extensão CodeLLDB .