Depurar uso de memória nativa

Limpador de endereços: HWASan/ASan

Os desenvolvedores da plataforma Android usam o HWAddressSanitizer (HWASan) para encontrar bugs de memória em C/C++.

É possível atualizar as imagens HWASan pré-criadas para dispositivos Pixel com suporte em ci.android.com (instruções detalhadas de configuração).

Desde o Android 8.0 (Oreo) também é possível usar o ASan para depurar apps em dispositivos de produção sem acesso root. Veja instruções na wiki do ASan.

Heapprofd

O Android 10 oferece suporte ao heapprofd, um criador de perfil de heap de baixa sobrecarga. O heapprofd permite atribuir o uso de memória nativa às pilhas de chamadas no programa. Consulte heapprofd - Android Heap Profiler no site de documentação do Perfetto (links em inglês) para saber mais.

Depuração Malloc

Consulte Depuração Malloc e Rastreamento de memória nativa usando callbacks de libc para conferir uma descrição completa das opções de depuração disponíveis para problemas de memória nativa.

libmemunreachable

O libmemunreachable do Android é um detector de vazamento de memória nativa sem sobrecarga. Ele usa uma passagem imprecisa de coletor de lixo de marcação e varredura em toda a memória nativa, informando qualquer bloco inacessível como vazamentos. Consulte a documentação libmemunreachable para instruções de uso.

Hooks Malloc

Caso queira criar as próprias ferramentas, a libc do Android também é compatível com a interceptação de todas as chamadas de alocação/livres que ocorrem durante a execução do programa. Consulte a documentação do malloc_hooks (em inglês) para conferir instruções de uso.

Estatísticas Malloc

O Android oferece suporte às extensões mallinfo(3) e malloc_info(3) para <malloc.h>. A função malloc_info está disponível no Android 6.0 (Marshmallow) e versões mais recentes. O esquema XML dela está documentado no <malloc.h> da Bionic.

Servidor Dalvik Debug Monitor

Também é possível usar o Dalvik Debug Monitor Server (DDMS) para ter uma visualização gráfica da saída de depuração Maloc.

Para usar o DDMS, primeiro ative a interface de memória nativa dele:

  1. Abrir ~/.android/ddms.cfg
  2. Adicione a linha: native=true

Ao reiniciar o DDMS e selecionar um processo, você pode alternar para a nova guia de alocação nativa e preenchê-la com uma lista de alocações. Isso é especialmente útil para depurar vazamentos de memória.