Профилирование выполнения функций
Для выявления проблем, связанных с выполнением функций, можно использовать утилиту 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
.