Esta é a segunda edição de uma série dividida em duas partes sobre as Novidades dos criadores de perfil no Android Studio 4.1. Nossa postagem anterior abordou as Novidades do System Trace.
Para os desenvolvedores de C++, fazer a depuração de memória nativa pode ser bastante difícil, principalmente em jogos. Com o Android Studio 4.1, implementamos a capacidade de gravar pilhas de chamadas de alocações de memória nativa no nosso Memory Profiler. A gravação de memória nativa é integrada ao back-end do Perfetto, a solução de instrumentação e rastreamento de desempenho de última geração para Android.
Uma técnica comum ao tentar depurar problemas de memória é entender quais processos alocam ou liberam espaço de armazenamento. Ao ler este artigo, você verá como usar o Native Memory Profiler para rastrear um vazamento, usando o Teste de estresse de emulação de GPU como um exemplo de projeto.
Para acompanhar o processo, faça a clonagem ou o download da amostra em https://github.com/google/gpu-emulation-stress-test.
Em geral, quando há suspeita de vazamento de memória, é uma boa ideia começar em um nível superior e observar os padrões na memória do sistema. Para fazer isso, clique no botão de perfil no Android Studio e digite o perfil de memória para ver informações mais detalhadas sobre o rastreamento de memória.
Depois de realizar a simulação algumas vezes, podemos ver alguns padrões interessantes.
A partir do Android Studio 4.1 Canary 6, podemos capturar uma gravação de alocações de memória nativa para analisar por que a memória não está sendo liberada. Para fazer isso com o aplicativo de emulação de GPU, interrompi o funcionamento do aplicativo em execução e comecei a criar um perfil de uma nova instância. Iniciar o processo em um estado limpo, principalmente quando há uma base de código desconhecida, pode ajudar a definir melhor o foco do trabalho. No criador de perfil de memória, capturei uma gravação de alocação nativa durante toda a demonstração da emulação de GPU. Para fazer isso, reinicie o aplicativo selecionando Executar-> Perfil “aplicativo”. Depois que o aplicativo for iniciado e a janela de perfil for aberta, clique no perfil de memória e selecione "gravar alocação nativa”
A visualização da tabela é útil para jogos/aplicativos que usam bibliotecas implementando os próprios alocadores, com o destaque de chamadas de malloc feitas fora das novas.
Quando uma gravação é carregada, os dados são apresentados pela primeira vez em uma tabela. A tabela mostra as funções folha chamando malloc. Além do nome da função, a tabela mostra o módulo, a contagem, o tamanho e o delta. Essas informações são amostradas para que seja possível capturar somente algumas chamadas malloc/liberadas. Isso depende em grande parte da taxa de amostragem, que será discutida mais adiante.
Também é útil saber de onde essas funções que alocam memória estão sendo chamadas. Existem duas maneiras de visualizar essas informações. A primeira é alterando o menu suspenso "Organizar por método de alocação" para "Organizar por pilha de chamadas". A tabela mostra uma árvore de pilhas de chamadas, semelhante ao esperado em uma gravação de CPU. Se o projeto atual tiver símbolos, o que é comum em versões depuráveis, eles serão escolhidos e usados automaticamente. Caso você esteja criando um APK externo, consulte este guia. Isso permite que você clique com o botão direito do mouse em uma função e escolha “Ir para a fonte”.
Também adicionamos uma nova visualização do diagrama de chamas para os criadores de perfis de memória, permitindo que você veja rapidamente quais pilhas de chamadas alocam mais memória. Isso é útil em especial quando há uma pilha de chamadas muito profunda.
Há quatro maneiras de classificar esses dados ao longo do eixo X:
A partir daqui, podemos clicar com o botão direito do mouse nas pilhas de chamadas e selecionar "Ir para a fonte" para acessar a linha de código responsável pela alocação. No entanto, ao analisar a visualização com atenção, notamos que o pai comum, WorldState, é responsável por vários vazamentos. Para validar isso, você pode filtrar os resultados.
Assim como na visualização da tabela, o gráfico pode ser filtrado usando a barra de filtros. Ao usar um filtro, os dados no gráfico são atualizados de maneira automática para mostrar somente as pilhas de chamadas com funções que correspondem à palavra/regex pesquisada.
Às vezes, as pilhas de chamadas ficam muito longas ou simplesmente não há espaço suficiente para exibir o nome da função na tela. Para ajudar nesse processo, use a tecla CTRL + a roda do mouse para aumentar/diminuir o zoom ou clique no gráfico e use os comandos W, A, S, D para navegar.
Adicionar um ponto de interrupção e realizar a emulação rapidamente duas vezes revela que, na segunda execução, provocamos o vazamento substituindo o ponteiro da primeira execução.
Para fazer uma correção rápida da amostra, podemos excluir “world” após a marcação de conclusão, criando novamente um perfil do aplicativo para validar a alteração.
Terminamos no ponto em que começamos ao analisar as estatísticas de memória de nível superior. A validação dessa exclusão de “sWorld” no final da simulação libera os 70 MB mantidos na primeira execução.
A amostra acima mostra como o rastreamento de memória nativa pode ser usado para encontrar e corrigir vazamentos de memória. Outro uso comum do rastreamento de memória nativa é entender em que processos a memória é usada durante a inicialização do aplicativo. No Android Studio 4.1, também adicionamos a capacidade de capturar gravações de memória nativa desde a inicialização do aplicativo. Você pode acessar o recurso na caixa de diálogo "Configurações de execução/depuração" da guia "Criação de perfil".
Você pode personalizar o intervalo de amostragem ou gravar memória na inicialização, usando a caixa de diálogo “Configuração de execução”.
Aqui você também pode alterar a taxa de amostragem para novas capturas. Usar uma taxa de amostragem menor pode gerar um grande impacto no desempenho geral, já que escolher uma opção maior talvez resulte na perda de algumas alocações. Diferentes taxas de amostragem funcionam para tipos distintos de problemas de memória.
Com o novo criador de perfis de memória nativa, ficou mais fácil encontrar vazamentos e entender em que processos a memória é mantida. Experimente o criador de perfis de memória nativa no Android Studio 4.1 e compartilhe seu feedback sobre nosso rastreador de bugs. Para ver mais dicas e orientações, confira também nossa palestra realizada no início deste ano no Google for Games Summit sobre práticas recomendadas e ferramentas de memória do Android.
Postar um comentário
Nenhum comentário :
Postar um comentário