Выявление утечек памяти с помощью Memcheck
Для выявления проблем, связанных с управлением памятью, можно использовать утилиту Memcheck
,
которая включена в набор инструментов профилирования Valgrind.
Сейчас профилирование работает только на эмуляторе. Для профилирования эмулятору рекомендуется выделять не менее 4 гигабайт оперативной памяти.
- Установка зависимостей
- Предварительная настройка проекта
- Профилирование приложения
- Просмотр результатов
Установка зависимостей
Установка инструмента Valgrind
, включающего в себя утилиту Memcheck
, выполняется на эмулятор.
Для установки требуется подключиться
по ssh
к эмулятору и установить пакеты valgrind
и valgrind-extratools
.
Команды для установки:
devel-su pkcon install valgrind
devel-su pkcon install valgrind-extratools
Предварительная настройка проекта
Чтобы во время сборки в режиме Профилирования не было ошибок
и debug-файлы попадали на эмулятор,
можно их явно включить в rpm-пакеты в секции %files
в spec-файле:
%{_bindir}/%{name}.debug
Либо включить всю папку /usr/bin:
%{_bindir}
Примечание. После завершения профилирования перед запуском приложения в эксплуатацию данные параметры следует исключить из spec-файла.
Профилирование приложения
Для профилирования приложения следует выполнить следующие шаги:
-
Выбрать тип сборки Профилирование.
-
Переключить Аврора IDE в режим Проекты.
-
Выбрать пункт Запуск для таргета.
-
В разделе Запуск в выпадающем списке Конфигурация запуска добавить конфигурацию
ru.auroraos.TestAppName (on %{Device:Name})
. Гдеru.auroraos.TestAppName
— имя приложения, которое нужно протестировать. Данная конфигурация приложения в указанных в данном пункте параметрах совпадает с конфигурацией по умолчанию, тем не менее рекомендуется создать новую, чтобы можно было легко переключаться между обычным запуском приложения и запуском в режиме профилирования. -
Активировать поле Сменить программу на устройстве с помощью галочки и и указать
valgrind
в поле Использовать эту команду . -
В поле Параметры командной строки указать параметры:
--leak-check=full --xml=yes --xml-file=result.xml ru.auroraos.TestApp
Описание параметров:
- Значение
ru.auroraos.TestApp
— название приложения, которое указано в поле Name в файле .spec. - Параметр
--xml=yes
включает сохранение результатов профилирования в.xml
-файл. - Параметр
--xml-file=result.xml
указывает имя файла, в который нужно сохранить результат. - Параметр
--leak-check=full
включает предоставление подробной информации о каждом определённо потерянном или возможно потерянном блоке памяти.
В этом же поле можно настроить работу профайлера с помощью других параметров:
--leak-resolution=<low|med|high>
определяет, как можно объединить несколько утечек в один общий отчёт;--show-leak-kinds=<set>
определяет типы искомых утечек;--errors-for-leak-kinds=<set>
указывает виды утечек, которые следует считать ошибками;--leak-check-heuristics=<set>
указывает набор эвристик для проверки утечек;--show-reachable=<yes|no>
,--show-possibly-lost=<yes|no>
являются альтернативами предыдущим параметрам;--xtree-leak=<no|yes>
,--xtree-leak-file=<filename>
включает вывод результатов в формате дерева, и если да, то в какой файл;--undef-value-errors=<yes|no>
определяет, будет или нет сообщение об использовании ошибок неопределённого значения;--track-origins=<yes|no>
определяет, отслеживается или нет происхождение неинициализированных значений;--partial-loads-ok=<yes|no>
управляет тем, как Memcheck обрабатывает 32-, 64-, 128- и 256-битные загрузки с естественным выравниванием с адресов, для которых одни байты адресуются, а другие нет;--expensive-definedness-checks=<no|auto|yes>
определяет, следует ли использовать более точные, но и более затратные по времени инструменты при проверке конкретных значений;--keep-stacktraces=alloc|free|alloc-and-free|alloc-then-free|none
управляет тем, какие трассировки стека следует сохранять для блоковmalloc
и/илиfree
.--freelist-vol=<number>
указывает в байтах максимальный общий размер блоков в очереди на очистку памяти;--freelist-big-blocks=<number>
указывает, что при очистке памяти в приоритете следует перераспределять блоки с размером, большим или равнымnumber
;--ignore-range-below-sp=<number>-<number>
указывает, что не нужно сообщать об ошибках доступа по указанным смещениям ниже указателя стека;--show-mismatched-frees=<yes|no>
проверяет, освобождаются или нет блоки кучи с помощью функции, которая соответствует функции выделения;--ignore-ranges=0xPP-0xQQ[,0xRR-0xSS]
указывает, какие диапазоны адресов игнорировать;--malloc-fill=<hexnumber>
заполняет блоки, выделенныеmalloc
,new
и т. д., но неcalloc
, указанным байтом;--free-fill=<hexnumber>
заполняет блоки, освобожденныеfree
,delete
и т. д., указанным значением байта.
Подробнее о параметрах можно прочитать в официальной документации по инструменту
Memcheck
. - Значение
-
Запустить приложение из IDE в режиме профилирования с помощью кнопки запуска приложения.
Выполнить в приложении задуманный сценарий и завершить работу приложения. Производительность приложения во время профилирования, как правило, существенно снижается. По окончании работы приложения профайлер создаст в домашней директории файл с результатами профилирования. Имя файла соответствует значению, указанному в параметре
--xml-file
.
Для переноса файла с результатами следует выполнить на компьютере разработчика команду, аналогичную приведённой ниже.
Для эмулятора:
scp -P 2223 -i ~/AuroraOS/vmshare/ssh/private_keys/sdk defaultuser@localhost:result.xml /path/to/local/place
где scp
— утилита, позволяющая копировать файлы с удалённого ресурса.
Команда в данной инструкции приводится для Unix-совместимого терминала.
В Linux и macOS можно использовать стандартный терминал, в Windows необходимо использовать
Git Bash.
Просмотр результатов
Перед просмотром результатов профилирования необходимо перенести .xml
-файл с результатом
с эмулятора в систему разработчика, где ведётся работа над проектом
(см. шаг 7 Профилирование приложения).
Чтобы посмотреть результаты, необходимо:
- Переключить IDE в режим Отладка.
- Выбрать Memcheck в выпадающем списке панели отладки.
- Нажать на
и выбрать
.xml
-файл с результатом.
Примечание. Из-за неполной совместимости инструмента Memcheck
с ОС Windows все найденные профайлером утечки
памяти записываются во Внешние ошибки, где не поддерживается открытие файлов в редакторе при навигации.
Однако в области просмотра результатов указываются имена файлов и номера строк кода с ошибкой,
поэтому файл с ошибкой можно открыть вручную.
Фильтр Внешние ошибки по умолчанию выключен.
Чтобы его включить, нужно нажать
на значок фильтра
и в выпадающем списке поставить галочку напротив пункта Внешние ошибки.