Профилирование выполнения функций
Для выявления проблем, связанных с выполнением функций, можно использовать утилиту Callgrind,
которая включена в набор инструментов профилирования Valgrind.
Callgrind записывает историю вызовов функций, которые выполняются во время работы приложения.
Он собирает количество выполняемых инструкций, их связь с исходным кодом,
отношения между вызываемыми и вызывающими функциями, а также количество таких вызовов.
Сейчас профилирование работает только на эмуляторе. Для профилирования эмулятору рекомендуется выделять не менее 4 гигабайт оперативной памяти.
- Установка зависимостей
- Предварительная настройка проекта
- Профилирование функций
- Просмотр результатов
- Настройка профайлера
Установка зависимостей
Установка инструмента Valgrind, включающего в себя утилиту Callgrind, выполняется на эмулятор.
Для установки требуется подключиться
по 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-файла.
Профилирование функций
Перед запуском профайлера требуется собрать и установить приложение, используя тип сборки Профилирование.
Для выполнения профилирования функций, необходимо выполнить следующие шаги:
- Открыть меню Анализ и выбрать пункт Профайлер функций Valgrind (внешняя программа).
- В открывшемся диалоге заполнить поля данными:
- Выбрать комплект сборки.
- В поле Программа указать название приложения.
Например,
ru.auroraos.TestApp. Название приложения должно соответствовать значению Name из файла .spec. - В поле Параметры указать передаваемые приложению параметры, при необходимости.
- Нажать ОК. Приложение будет запущено.
- Выполнить в приложении задуманный сценарий и завершить работу приложения. По окончании работы приложения профайлер создаст файл с результатами профилирования в домашней директории. Файл callgrind.out.*, где * — число, добавленное программой для уникальности названия.
Переместить файл с эмулятора на компьютер разработчика можно, выполнив на компьютере разработчика команду, аналогичную приведённой ниже.
Для эмулятора:
scp -P 2223 -i ~/AuroraOS/vmshare/ssh/private_keys/sdk defaultuser@localhost:callgrind.out.1 /path/to/local/place
где scp — утилита, позволяющая копировать файлы с удалённого ресурса.
Команда в данной инструкции приводится для Unix-совместимого терминала.
В Linux и macOS можно использовать стандартный терминал, в Windows необходимо использовать
Git Bash.
Просмотр результатов
Перед просмотром результатов профилирования необходимо перенести файл callgrind.out.* в систему разработчика, где ведётся работа над проектом (см. шаг 4 Профилирование функций).
Для просмотра результатов следует выполнить следующие шаги:
-
Переключить IDE в режим Отладка.
-
Выбрать Callgrind в выпадающем списке панели отладки.
-
Нажать на
и выбрать файл
с результатом профилирования callgrind.out.*.
Для фильтрации результатов нужно указать строку в поле Фильтр.
Для просмотра подробной информации о функции достаточно навести на неё курсор в одноименной вкладке Функции.
Для просмотра информации о вызывающих и вызываемых функциях следует дважды кликнуть на функцию в соответствующих вкладках Вызывающие и Вызываемые.
Для переключения между функциями можно использовать кнопки < и > на вкладке Вызываемые.
Для установки формата цен следует нажать на $. Цена в Callgrind равна количеству событий, например, вызовов функции. Можно увидеть абсолютные и относительные цены, а также цены, относительные к родительской. Чтобы увидеть информацию, которая получена только из файлов проекта, следует нажать на значок фильтра
.Для корректной обработки рекурсивных или циклических вызовов функций, необходимо включить обнаружение циклов, нажав на O.
Для удаления списков обобщённых параметров при отображении имен функций, следует нажать <>.
Настройка профайлера
Работу профайлера можно настроить через передачу параметров. Например, можно настроить следующие опции:
--callgrind-out-file=<file>записывает данные профиля в заданный файл;--dump-every-bb=<count>создаёт дамп данных профиля для каждого базового блока;--instr-atstart=<yes|no>указывает, запускать ли профилирование с самого начала программы;- параметры
--collect-*указывают, какие конкретные данные следует собирать или не собирать; --separate-threads=<no|yes>разделяет сбор данных для потоков;--cache-sim=<yes|no>указывает, выполнять ли симуляцию кэша;--branch-sim=<yes|no>указывает, выполнять ли симуляцию предсказания ветвления.
Полный список доступных параметров можно найти
в официальной документации
инструмента Callgrind.
Параметры Callgrind можно указать глобально для всех проектов и индивидуальные
для каждого проекта.
Чтобы указать глобальные настройки Callgrind, нужно открыть меню Инструменты → Параметры
и выбрать в списке Анализатор.
На вкладке Valgrind в поле Extra Callgrind arguments можно ввести
дополнительные аргументы Callgrind.
Чтобы указать для проекта индивидуальные параметры Callgrind, нужно выполнить следующие шаги:
- Переключить IDE в режим Проекты.
- Выбрать пункт Запуск у сборки.
- Перейти в раздел Настройки Valgrind, нажав на Подробнее, и сменить значение в выпадающем списке с Общие на Особые.
- Ввести в поле Extra Callgrind arguments дополнительные аргументы
Callgrind.