Аннотация:
На настоящий момент при разработке программного обеспечения активно используются методы автоматического статического и динамического анализа программ. Так, динамический анализ предоставляет возможности обнаруживать дефекты и ошибки проектирования, проявляющиеся во время выполнения программ, требуя минимального участия эксперта. При проведении динамического анализа распространены два подхода к исследованию выполнения программы — внешний мониторинг, осуществляющийся системными средствами и отладчиками, и инструментация программного кода — модификация и внедрение дополнительной функциональности. При анализе исполняемого кода во внутреннем представлении, обрабатываемого интерпретатором или виртуальной машиной, становиться возможно применение третьего подхода — мониторинга средствами самого интерпретатора или виртуальной машины. В данной статье рассмотрены возможности подобного подхода на примере проведения анализа использования динамической памяти в виртуальной машине Dalvik операционной системы Android.
Работа над представленным методом обусловлена ограничениями виртуальной машины Dalvik, приводящими к невозможности использования большого количества существующих инструментов профилирования памяти. В данной статье рассмотрены непосредственные модификации виртуальной машины Dalvik, включающие расширение поддержки стандартного протокола Java Debug Wire Protocol, для отслеживания событий выделения, освобождения и доступа к памяти. Дополнительно приведён обзор возможностей разработанного отладчика, обеспечивающего регистрацию данных событий в режиме реального времени для последующей обработки. Представленный отладчик, основанный на существующем средстве Dalvik Debug Monitor, позволяет проводить работу одновременно с несколькими активными процессами и обработку результатов множественных запусков. В рамках практических экспериментов были рассмотрен набор стандартных пользовательских приложений Android, выполняющихся на модифицированной версии виртуальной машины Dalvik под контролем разработанного отладчика. Эксперименты позволили выявить некоторые базовые особенности работы с памятью, включающие активное использование массивов примитивных типов языка Java и неэффективность использования памяти, выделяемой для объектов классов, отвечающих за отображение элементов графического интерфейса приложений.
Ключевые слова:динамический анализ программ, профилирование памяти, Java, Android.