Depurando o B2G usando Valgrind

S

ValgrindDSS dá acesso aos desenvolvedores à informações sobre alocação de memória, threads/processos, e outras coisas relevantes à performance do programa. Está incluído na árvore do Firefox OS, e pode ser executado por telefones que tem os recursos adequados. Esse artigo explica como usá-lo.

Requisitos

Antes de executar o Valgrind no Firefox OS, é recomendado que os desenvolvedores familiarizem-se com o artigo Depurando Mozilla com ValgrindDSDDSDDSG. Muitas das informações desse artigo são relevantes ao executar o Valgrind no Firefox OS, embora muitas das etapas de compilação e linhas de comando são atendidos pela imagem Firefox OS e os scripts de execução.

Para rodar o Valgrind no telefone com Firefox OS, é necessário um aparelho com especificações maiores que o normal. Valgrind é um recurso que consome muita memória, geralmente causando falhas de falta de memória em aparelhos com menos de 1GB de RAM. Nesse artigo (de 2013-12-04), Valgrind foi testado em um aparelho Nexus 4 rodando Firefox OS com 2GB de RAM, mas pode ser executado em aparelhos Geeksphone Keons ou similares. Verifique em Especificações de Telefones para maiores detalhes dos aparelhos disponíveis.

Executando Valgrind em telefones com FxOS

Compilando

Para compilar o Firefox OS com o valgrind habilitado, inclua no arquivo.userconfig.

export B2G_VALGRIND=1 

Compilar com debug (B2G_DEBUG) também é recomendado. Compilação sem otimizações (B2G_NOOPT) torna a usabilidade um pouco mais lenta, e não é reomendado a não ser nos casos onde as otimizações podem ofuscar os erros.

Executando

Nota: A execução do Valgrind em um telefone Firefox OS é realizada no contexto do telefone, não no sistema operacional hospedeiro. Isso siginifica que os desenvolvedores podem usar qualquer plataforma com o adb disponível e executar o script run-valgrind.sh para iniciar o valgrind no telefone.

Para executar o Firefox OS sob o valgrind, use o script run-valgrind.sh a partir do diretório B2G. Esse script faz o seguinte:

  1. Remonta o sistema de arquivos do telefone com r/w.
  2. Copia a biblioteca atual libxul.so com os símbolos completos do telefone. Como esse arquivo tem centenas de MB esse passo leva muito tempo para terminar. E precisa ser refeito a cada vez que uma nova compilação é feita. Para executar o valgrind sem copiar libxul execute esse comando:
    run-valgrind.sh nocopy
  3. Reinicia o telefone.
  4. Encerra os processos b2g que foram iniciados.
  5. Executa o seu próprio processo b2g sob o valgrind.

Toda a saída do valgrind é escrita em stdout do terminal que executou o script run-valgrind.sh. Essa saída pode ser lida no terminal ou direcionada para um arquivo.

Nota: Uma vez que o script run-valgrind.sh é o proprietário do processo adb que executa o processo b2g, ao encerrar o script, os processos b2g e valgind também serão encerrados no telefone. É recomendado que o telefone seja reiniciado após o término de uma sessão do valgrind, para evitar problemas.

Executando Valgrind no Firefox OS Desktop

Executar o valgrind no Firefox OS Desktop funciona da mesma forma que excutar o Firefox (navegador). Consulte o artigo Depurando o  Mozilla com ValgrindDDS para mais informações. Todos os flags de compilação relevantes necessários a ser incluídos no mozconfig, e todos os problemas específicos das plataformas descritos na página devem ser aplicados.

Observe que ao executar Valgrind no desktop em modo OOP/process-per-tab requer adicionar as seguintes opções para certificar-se que os processos-filho também estão sendo monitorados:

--trace-children=yes

Mantendo e atualizando o Firefox OS Valgrind

Durante as liberações de correções, Valgrind para Firefox OS é mantido em um repositório forked para mantê-lo o mais atualizado possível enquanto as excentricidades do Firefox OS são adequadas às mais novas versões.

Atualizando Repositórios Valgrind

AVISO: NECESSÁRIO EXPERIÊNCIA COM GIT. Não tente atualizar o repositório Valgrind se você não dominar operações complexas do Git. Qualquer atualização no repositório do GitHub será refletida em git.mozilla.org, que por sua vez irão para os desenvolvedores que usam o HEAD dos repositórios de manifesto.

Os repositórios principais do Firefox OS valgrind e VEX são

O master branch é uma versão antiga do trunk SVN de cada um desses repos, enquanto que o branch Firefox OS contém correções específicas do Firefox OS baseadas no topo do trunk.

Nota: SEMPRE ATUALIZE AMBOS OS REPOS NO MESMO MOMENTO. Apesar de serem dois repos separados, VEX normalmente é um submódulo do Valgrind, e o HEAD do Valgrind normalmente aponta para o HEAD do VEX.

Esses estão replicados no domínio git.mozilla.org para se usado nos manifestos  B2G:

  1. Os repos principais são mantidos em sincronismo com o valgrind SVN com git svn. Para carregar as atualizações nos repos, clone os repos valgrind e vex do github, então execute o comando abaixo:
    git svn init -s [subversion repo url]
    
  2. Envira as alterações para o SVN pode levar horas, mas quando for feito sua árvore deve estar sincronizada com a árvore principal do SVN.
  3. Para enviar futuras atualizações, utilize o seguinte grupo de comandos:
    git checkout master
    git svn fetch
    git svn rebase
    git push [github-remote-name] master
    git checkout fxos
    git rebase master
    
  4. Existe a chance de existir conflitos entre as correções durante o rebase do branch do Firefox OS. Se não conseguir resolver os conflitos, envie um email para o autor para que ele resolva os conflitos encontrados.
  5. Depois do rebase, execute uma compilação completa do Firefox OS com a opção B2G_VALGRIND para certificar-se que ainda funciona. Os consertos mais comuns são listados na seção a seguir.
  6. Uma vez feito o rebase E TESTADA a compilação contra a árvore Firefox OS, você deve forçar um push para o branch Firefox OS devido à alteração do head.
    git push -f [github-remote-name] fxos

Scripts de compilação, instalação e execução

Existem diversos scripts que fazem parte do branch Valgrind Firefox OS ou do repo B2Gque podem necessitar serem alterados após um fetch do repo.

external/valgrind/android.mk

Esse é um script de compilação do sistema Android. As alterações nesse script são devido ao de arquivos que são adicionados ou removidos da árvore Valgrind. Use uma compilação com -j1 para verificar quais os alvos falham na compilação e se foi esquecido algum arquivo ou há alguma referência a um arquivo inexistente.

external/valgrind/valgrind.mk

Contém uma lista de pacotes que necessitam ser compilados e adicionados à imagem do FxOS, referenciada por gonk-misc/b2g.mk. Normalmente esse script não necessita ser alterado uma vez que é raro que o Valgrind inclua novos pacotes, mas se isso acontecer, informe nesse arquivo.

run-valgrind.sh

Script para executar o Valgrind no telefone. Se exitem novos argumentos na linha de comando necessários para rodar o Valgrind no telefone, inclua-os aqui. Isso também é utilizado quando nós copiamos a biblioteca com depuração, assim qualquer ajuste ou alteração a esse processo deve acontecer aqui.

Etiquetas do documento e colaboradores

 Colaboradores desta página: jwhitlock, rbrandao
 Última atualização por: jwhitlock,