Как отлаживать использование нативной памяти

Address Sanitizer: HWASan/ASan

Разработчики платформы Android используют HWAddressSanitizer (HWASan) для поиска ошибок памяти в коде на C/C++.

Вы можете прошить готовые образы HWASan на поддерживаемые устройства Pixel с сайта ci.android.com (подробные инструкции по настройке).

Начиная с Android 8.0 (Oreo) ASan можно использовать для отладки приложений на рабочих устройствах без root-доступа. Инструкции можно найти на вики-странице ASan.

Heapprofd

В Android 10 поддерживается heapprofd – профилировщик кучи с низкими накладными расходами. Он позволяет сопоставлять использование нативной памяти со стеками вызовов в программе. Дополнительную информацию можно найти в разделе heapprofd - Android Heap Profiler на сайте документации Perfetto.

Отладка выделения памяти

Подробное описание вариантов отладки, доступных для проблем с нативной памятью, можно найти в разделах Отладка Malloc и Отслеживание нативной памяти с помощью обратных вызовов libc.

libmemunreachable

libmemunreachable – это встроенный детектор утечек памяти Android, который не требует дополнительных ресурсов. Он использует неточный проход сборщика мусора с пометкой и удалением по всей собственной памяти, сообщая о любых недостижимых блоках как об утечках. Инструкции по использованию приведены в документации по libmemunreachable.

Хуки malloc

Если вы хотите создать собственные инструменты, libc в Android также поддерживает перехват всех вызовов выделения и освобождения памяти, которые происходят во время выполнения программы. Инструкции по использованию можно найти в документации по malloc_hooks.

Статистика malloc

Android поддерживает расширения mallinfo(3) и malloc_info(3) для <malloc.h>. Функция malloc_info доступна в Android 6.0 (Marshmallow) и более поздних версиях. Ее XML-схема описана в <malloc.h> Bionic.

Сервер мониторинга отладки Dalvik

Вы также можете использовать сервер мониторинга отладки Dalvik (DDMS), чтобы получить графическое представление выходных данных Malloc Debug.

Чтобы использовать DDMS, сначала включите его встроенный интерфейс памяти:

  1. Открыть приложение "~/.android/ddms.cfg"
  2. Добавьте строку: native=true

После перезапуска DDMS и выбора процесса можно перейти на новую вкладку "Собственное размещение" и заполнить ее списком размещений. Это особенно полезно при отладке утечек памяти.