gdb
é um depurador de linha de comando que fornece um grande número de opções úteis para depurar aplicações Firefox OS. Outras ferramentas também estão disponíveis como b2g-ps
, que é um empacotador da ferramanta padrão ps que mostra os nomes dos aplicativos que estão sendo executados numa instância do B2G. Esse artigo mostra como executar tarefas de depuração com essas ferramentas.
Começando a depurar no modo single-process
Nota: Antes de executar o depurador você pode configurar o arquivo .userconfig
para customizar algumas coisas. Veja o artigo Customização com o arquivo .userconfig para maiores detalhes.
Para reiniciar Firefox OS e executá-lo sob o controle do gdb, simplesmente use o scritp run-gdb.sh
:
./run-gdb.sh
Nota: Se você quiser depurar no emulador, certifique-se que não há telefones conectados ao computador, isso pode gerar conflitos ao gdb tentar conectar ao emulador.
Se o Firefox OS já estiver rodando e você quiser conectar o gdb sem reiniciá-lo, você pode fazer algo como isso:
./run-gdb.sh attach
Depurando tarefas fora do processo
Devido ao fato da natureza multiprocessamento do Firefox OS, frequentemente você necessitará depurar tarefas que não a tarefa B2G. Para fazer isso, o modo mais simples é usar o comando b2g-ps
para descobrir o PID do processo que você precisa depurar:
$ adb shell b2g-ps b2g root 106 1 189828 56956 ffffffff 40101330 S /system/b2g/b2g Browser app_0 4308 106 52688 16188 ffffffff 400db330 S /system/b2g/plugin-container
No exemplo, Browser é um processo filho usado como "content process" para a aplicação browser. Assim se você deseja depurar o "content process", nesse exemplo, faça:
$ ./run-gdb.sh attach 4308
Algumas vezes, é útil ser notificado imediatamente de qualquer criação de processos filhos.
Isso pode ser ativado iniciando run-gdb.sh
com a variável de ambiente MOZ_DEBUG_CHILD_PROCESS
:
MOZ_DEBUG_CHILD_PROCESS=1 ./run-gdb.sh
Feito isso, lançando uma aplicação OOP no Firefox OS será mostrado o PID do "plugin-conteiner" para essa tarefa, e o processo dormirá por 30 segundos, tempo suficiente para você rodar o comando para anexar o depurador como visto abaixo:
$ ./run-gdb.sh attach 4308
Se você estiver tentando depurar algo que ocorre durante o boot, você tem que lançar uma instância do depurador muito rápido. Uma vez que o depurador foi iniciado, você deve imediatamente pressionar "c" para continuar a executar a nova tarefa.
Suporte
Qual o nível de funcionalidade esperado
Os recursos de depuração a seguir ao menos devem funcionar, caso contrário, provavelmente um pequeno ajuste na configuração o fará funcionar:
- Símbolos para todas as bibliotecas (exceto talvez alguns drivers de alguns telefones Android)
- Informações de backtraces com depuração completa (exceto para valores de argumentos optimized-away)
- Breakpoints: Você deve poder criar breakpoints num símbolo, ou em arquivo:linha, ou em endereço. Todas as opções devem funcionar.
- Single-stepping ('s' e 'n' devem funcionar)
Os serguintes recursos de depuração não são suportados. Não tente usá-los:
- Watchpoints.
Resolução de problemas
Existem algumas coisas para tentar resolver caso o gdb
não funcione como descrito acima.
Certifique-se que seu clone B2G está atualizado
Tenha sempre em mente que para atualizar seu clone B2G você deve executar esses dois comandos:
git pull ./repo sync
Ao esquecer do git pull
poderá acontecer de você executar um antigo run-gdb.sh
e não se beneficiar das últimas melhorias.
Certifique-se de que você anexou o gdb ao processo correto
Anexando-se a um processo errado (por exemplo, processo B2G principal versus processo Browser) pode explicar porque o depurador não para nos breakpoints.
Certifique-se de que os símbolos foram corretamente lidos
- No
gdb
, useinfo shared
para checar se os símbolos foram corretamente lidos:(gdb) info shared From To Syms Read Shared Object Library 0xb0001000 0xb0006928 Yes out/target/product/otoro/symbols/system/bin/linker 0x40051100 0x4007ed74 Yes /hack/b2g/B2G/out/target/product/otoro/symbols/system/lib/libc.so 0x401ab934 0x401aba2c Yes /hack/b2g/B2G/out/target/product/otoro/symbols/system/lib/libstdc++.so ...
- A coluna
Syms Read
deve estar comYes
sempre. Talvez em alguns telefones Android você pode verYes (*)
para algumas bibliotecas de sistema ou drivers, isso estará OK. Você somente não poderá ver umNo.
- Se você vir um
No
, será seu primeiro problema e você deve resolvê-lo antes de procurar qualquer outra coisa. - Procure por alguma outra mensagem de erro na saída do terminal logo após executar o comando
run-gdb.sh
. - Verifique também no terminal se a saída do terminal do comando GDB está ok. Em particular, o último argumento da linha de comando deve ser o caminho para o executável
b2g
. A seguir um exemplo:prebuilt/linux-x86/toolchain/arm-linux-androideabi-4.4.x/bin/arm-linux-androideabi-gdb -x /tmp/b2g.gdbinit.bjacob /hack/b2g/B2G/objdir-gecko/dist/bin/b2g
- Verifique o valor dessas variáveis GDB:
solib-search-path
esolib-absolute-prefix:
(gdb) show solib-search-path The search path for loading non-absolute shared library symbol files is /hack/b2g/B2G/objdir-gecko/dist/bin:out/target/product/otoro/symbols/system/lib:out/target/product/otoro/symbols/system/lib/hw:out/target/product/otoro/symbols/system/lib/egl:out/target/product/otoro/symbols/system/bin:out/target/product/otoro/system/lib:out/target/product/otoro/system/lib/egl:out/target/product/otoro/system/lib/hw:out/target/product/otoro/system/vendor/lib:out/target/product/otoro/system/vendor/lib/hw:out/target/product/otoro/system/vendor/lib/egl. (gdb) show solib-absolute-prefix The current system root is "out/target/product/otoro/symbols".
Nota: Se você precisar de mais ajuda, tente o canal #b2g no IRC. Se você acredita ter encontrado um bug, reporte-o aqui.