Usando depuradores

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

O GDB está obsoleto e será removido em breve. Se você estiver mudando de GDB para LLDB, provavelmente deve começar lendo o LLDB Tutorial . 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 compilação com o comando envsetup.sh usual.
  • Execute o mesmo comando de lunch que você usou ao compilar.

Para obter mais ajuda sobre como configurar seu ambiente, consulte Configurar ambiente .

Depurando 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 remoto apropriado no dispositivo, inicia o depurador no host, configura-o para localizar símbolos e o conecta ao stub de depuração remoto.

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 isso 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 há uma falha e 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 o carregamento do aplicativo e a exibição de 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 que o aplicativo seja executado, anexe um 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

Depurando aplicativos ou processos que falham

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

  • Após o 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 falha normal, o 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, o gdb não poderá 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 estiverem ausentes, defina a seguinte propriedade:

set arm fallback-mode arm  # or thumb

Depuração com VS Code

O LLDB dá suporte ao código da plataforma de depuração 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 compilação (como símbolos) necessários para executar gdbclient.py ou lldbclient.py estejam presentes.
  2. Execute o seguinte comando:
    lldbclient.py --setup-forwarding
          vscode-lldb ANY_OTHER_FLAGS -p pid | -n proc-name | -r ...

    Isso imprime um objeto JSON e lldbclient.py continua em execução. Isso é esperado; não mate o programa lldbclient.py .

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

  3. Na guia de depuração no VS Code, selecione add configuration e selecione LLDB: Custom Launch . Isso abre um arquivo launch.json e adiciona um novo objeto JSON a uma lista.
  4. Exclua a configuração do depurador recém-adicionada.
  5. Copie o objeto JSON impresso por lldbclient.py e cole-o no objeto que você acabou de excluir. Salve as alterações.
  6. Para recarregar a janela para atualizar a lista do depurador, pressione Ctrl+Shift+P e digite reload window .
  7. Selecione a nova configuração do depurador e pressione executar . O depurador deve se conectar após 10 a 30 segundos.
  8. Quando você terminar de depurar, vá para o terminal executando lldbclient.py e pressione Enter para encerrar o programa lldbclient.py .