Esta página detalha o uso do LLDB para desenvolvimento de SO. Para desenvolvimento de apps, consulte Depurar seu app, que explica como usar a GUI do Android Studio (com base no LLDB).
O GDB não é mais fornecido nem tem suporte. Se você estiver trocando do GDB para o LLDB, comece por ler o Tutorial do LLDB. Se você é um usuário avançado 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.shusual. - Execute o mesmo comando
lunchusado na criação. O item de inicialização precisa corresponder exatamente ao dispositivo que você está depurando. Se o item de almoço não corresponder ao dispositivo conectado, você vai receber um erro no formato:You used the wrong lunch: TARGET_PRODUCT (aosp_arm64) does not match attached device (xyzabc) - Conecte o dispositivo à máquina.
Para mais ajuda com a configuração do ambiente, consulte Configurar o ambiente.
Depurar um binário
Para depurar um binário criado na sua máquina, primeiro você precisa copiar o binário para o dispositivo e, em seguida, iniciar o depurador. Exemplo:
adb push test.exe /data/local/tmp/test.exelldbclient.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 a um daemon nativo, use
lldbclient.py com um PID. Por exemplo, para depurar o processo com o PID
1234, execute o seguinte no host:
lldbclient.py -p 1234
O script configura o encaminhamento de portas, inicia o stub de depuração remota adequado no dispositivo, inicia o depurador no host, configura para encontrar símbolos e conecta ao stub de depuração remota.
Depurar a inicialização de processos nativos
Para depurar um processo no início, use lldbclient.py com a opção
-r. Por exemplo, para depurar ls /bin, execute o seguinte no host:
lldbclient.py -r /system/bin/ls /bin
Em seguida, insira continue no prompt do depurador.
Depurar a inicialização do app
Às vezes, você quer depurar um app quando ele é iniciado, por exemplo, quando há uma falha
e você quer analisar o código para saber o que aconteceu antes da falha.
A conexão funciona em alguns casos, mas em outros é
impossível porque o app falha antes que você possa fazer a conexão. A
abordagem logwrapper (usada para strace)
não sempre funciona porque o app pode não ter
permissões para abrir uma porta, e o lldbserver herda essa
restrição.
Para depurar a inicialização do app, use as opções para desenvolvedores nas Configurações para instruir o app a esperar que um depurador Java seja conectado:
- Acesse Configurações > Opções do desenvolvedor > Selecionar app de depuração, escolha seu app na lista e clique em Aguardar o depurador.
- Inicie o app no iniciador ou usando a linha de comando para executar:
adb shell am start -a android.intent.action.MAIN -n APP_NAME/.APP_ACTIVITY
- Aguarde o carregamento do app e a exibição de uma caixa de diálogo informando que o app está aguardando um depurador.
- Anexe
lldbserver/lldbclientnormalmente, defina pontos de interrupção e continue o processo.
Para permitir a execução do app, anexe um depurador do 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
Depurar apps ou processos que geram falhas
Se você quiser que o debuggerd suspenda processos com falha para que você possa
anexar um depurador, defina a propriedade adequada:
- Após o 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 versões anteriores
adb shell setprop debug.db.uid 999999
No final da saída de falha normal, debuggerd fornece instruções de cópia e
colagem 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 no Visual Studio Code. É possível usar a interface do depurador do VS Code em vez da interface da CLI do LLDB para controlar e depurar o código nativo executado em dispositivos.
Antes de usar o VS Code para depuração, instale a extensão CodeLLDB.
Para depurar o código usando o VS Code:
- Verifique se todos os artefatos de build (como símbolos) necessários para executar
lldbclient.pyoulldbclient.pyestão presentes. - No VS Code, pressione Ctrl+Shift+P para executar um comando, pesquise Debug:
Add Configuration... e selecione LLDB.
Isso abre um arquivo
launch.jsone adiciona um novo objeto JSON a uma lista. - Substitua a configuração do depurador recém-adicionada por duas linhas de comentário:
// #lldbclient-generated-begine// #lldbclient-generated-end, para que a lista de configuração fique assim:"configurations": [ // #lldbclient-generated-begin // #lldbclient-generated-end ]
O
lldbclient.pyusa 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. - Execute o seguinte comando no terminal em que você executou
envsetup.shelunch:lldbclient.py --setup-forwarding vscode-lldb \ --vscode-launch-file LAUNCH_JSON_PATH \ ANY_OTHER_FLAGS -p pid | -n proc-name | -r ...lldbclient.pygrava a configuração gerada emlaunch.jsone continua em execução. Isso é esperado. Não encerre o programalldbclient.py. Se você ignorar o--vscode-launch-file, o script vai imprimir o snippet JSON que você vai precisar copiar e colar manualmente emlaunch.json.A flag
-rprecisa ser a última flag, se estiver presente, devido à forma como as flags são analisadas pela ferramenta. - Abra a barra lateral Run and Debug. A nova configuração vai aparecer na
lista do depurador. Pressione Iniciar depuração (F5). O depurador precisa 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 do depurador: pressione Ctrl + Shift + P e digite
reload window. - Quando terminar a depuração, acesse o terminal em execução
lldbclient.pye pressione Enter para encerrar o programalldbclient.py. Execuções subsequentes do script gerariam a configuração entre os comentários#lldbclient-generatede substituiriam o conteúdo antigo. Não é necessário removê-los manualmente.
Para adicionar propriedades personalizadas à configuração de inicialização gerada, use a
flag --vscode-launch-props. Exemplo:
lldbclient.py --setup-forwarding vscode-lldb \
--vscode-launch-props \
'{"initCommands" : ["script print(\"Hello\")"], "preLaunchTask" : "Build"}' \
...Build antes da depuração e
anexasse uma nova etapa de inicialização de depuração às etapas geradas pelo script. Confira uma
visão geral das propriedades disponíveis na
documentação do VS Code e no manual do usuário da
extensão CodeLLDB.