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, сначала включите его встроенный интерфейс памяти:
- Открыть приложение "
~/.android/ddms.cfg" - Добавьте строку:
native=true
После перезапуска DDMS и выбора процесса можно перейти на новую вкладку "Собственное размещение" и заполнить ее списком размещений. Это особенно полезно при отладке утечек памяти.