Usando depuradores

Esta página detalha o uso do LLDB 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 não é mais suportado ou fornecido. Se você estiver mudando de GDB para LLDB, provavelmente deveria começar lendo o Tutorial LLDB . Se você é um usuário experiente do GDB, o mapa de comando 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 durante a construção. 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 formato: You used the wrong lunch: TARGET_PRODUCT (aosp_arm64) does not match attached device (xyzabc)
  • Conecte seu dispositivo à máquina.

Para obter mais ajuda com a configuração do seu ambiente, consulte Configurar ambiente .

Depurando um binário

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

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

Depurando aplicativos ou processos em execução

Para se conectar a um aplicativo 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 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 assim que ele é iniciado, use lldbclient.py com a opção -r . Por exemplo, para depurar ls /bin , execute isto no host:

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

Em seguida, insira continue no prompt do depurador.

Depurando inicialização do aplicativo

Às vezes, você deseja depurar um aplicativo assim que 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 lldbserver 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 conexão de um depurador Java:

  1. Vá para Configurações > Opções do desenvolvedor > Selecione o aplicativo de depuração , escolha seu aplicativo na lista e clique em Aguardar depurador .
  2. Inicie o aplicativo a partir do inicializador 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 uma caixa de diálogo apareça informando que o aplicativo está aguardando um depurador.
  4. Anexe lldbserver / lldbclient 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ê deseja que debuggerd suspenda processos com falha para poder 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
    adb shell setprop debug.db.uid 999999
    
    inferior

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

Depuração com código VS

LLDB oferece suporte à depuração de código de plataforma no Visual Studio Code . Você pode usar o front-end do depurador do VS Code em vez da interface CLI do LLDB 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 código usando VS Code:

  1. Certifique-se de que todos os artefatos de construção (como símbolos) necessários para executar lldbclient.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-adicionada por duas linhas de comentários - // #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 escrever 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 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. Isto é esperado; não elimine o programa lldbclient.py . Se você omitir --vscode-launch-file o script imprimirá o snippet JSON que você precisará copiar e colar em launch.json manualmente.

    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 do depurador. Pressione Iniciar depuração (F5) . O depurador deve se conectar após 10 a 30 segundos.

    Se a nova configuração não apareceu na visualização Executar e Depurar, recarregue a janela para atualizar a lista do depurador - 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; você não precisa 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 anexaria 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 .