Отладка проекта
Отладку проекта можно выполнить несколькими способами.
Проект в целом можно отладить с помощью инструмента gdb. При этом необходимо учитывать, что для ОС Аврора 4 и выше изоляция приложений накладывает ограничения на отладчик.
QML-код можно изменять без перезапуска приложения. Для этого следует использовать QmlLiveBench.
Для QML и C++-частей приложения доступно профилирование.
Также для сбора отладочной информации можно воспользоваться утилитами командной строки.
Отладка приложений с изоляцией
Отладчик gdb можно подключить к приложению по номеру процесса, например, через консоль или переконфигурацию gdb из Аврора IDE и двустороннюю передачу данных между gdb и Аврора IDE.
При запуске приложений из Аврора IDE с конфигурацией по умолчанию отладчик gdb не будет работать, так как не будет запущена утилита sailjail, необходимая для отладки.
Для старта sailjail нужно запустить уже установленное приложение на устройстве или на эмуляторе через значок.
Отладку можно выполнить следующим образом:
-
Запустить приложение в песочнице, используя sailjail или firejail.
- Вариант 1: в разделе Проекты → Запуск поставить галочку Использовать песочницу и запустить проект как обычно.
-
Вариант 2:
sailjail --dry-run -- PATH
. -
Вариант 3 (для отладки c++-кода):
sailjail -- PATH
. -
Вариант 4 (для отладки qml):
firejail
c параметрами.
Изменить у приложения конфигурацию по умолчанию в разделе Проекты → Запуск:
- полю Сменить программу на устройстве задать значение /usr/bin/sailjail, предварительно поставив галочку Использовать эту команду напротив поля;
- полю Параметры командной строки задать значение -p <имя_приложения>.desktop /usr/bin/<имя_приложения>.
Данный способ ориентирован на физическое устройство, sailjail не применяется на эмуляторе.
Для отладки qml-кода нужно указать firejail вместо sailjail.
-
На устройстве потребуется ввести пароль разработчика. Он нужен для того, чтобы дать возможность GDB-серверу подключаться к процессу в песочнице. На эмуляторе пароль не требуется.
-
Получить pid приложения.
pidof <имя_приложения>
И подключить gdb к процессу, используя pid.
gdb <имя_приложения> -p <pid_приложения>
Ограничения данного способа отладки:
- поскольку gdb не запускает процесс, а подключается к нему, то нет возможности отлаживать ошибки запуска программы;
- при подключении gdb к процессу, сообщения, которые выводит процесс в консоль
методами
qDebug
и аналогичными, не передаются в окно Аврора IDE; - при запуске приложения в песочнице не работает горячая перезагрузка QML-страниц через QmlLiveBench;
- невозможно отладить инициализацию свободных статических переменных.
Следует отметить, что крайне не рекомендуется использовать в программе большое количество свободных статических переменных.
Для отладки процесса запуска программы можно добавить в код вызов метода
QThread::sleep(ЧИСЛО_СЕКУНД)
.
Параметр ЧИСЛО_СЕКУНД
можно подобрать в зависимости от быстродействия компьютера разработчика:
чем медленнее компьютер — тем больше стоит выбрать число.
Пример:
int main(int argc, char *argv[])
{
QThread::sleep(2);
QScopedPointer<QGuiApplication> app(SailfishApp::application(argc, argv));
...
}
В этом случае gdb сможет гарантированно остановиться на строке,
следующей после QThread::sleep(2)
, что позволит отлаживать процесс запуска программы.
Дамп приложения
На этапе разработки дамп приложения можно получить следующим образом:
-
Настроить режим разработчика на устройстве.
-
Подключиться по SSH к устройству:
ssh defaultuser@deviceip
-
Узнать настройки сохранения дампа, считав конфигурацию из файла
/proc/sys/kernel/core_pattern
. Это можно сделать с помощью команды:sysctl kernel.core_pattern
Данная настройка ядра используется ОС. После получения нужного дампа её необходимо будет восстановить, поэтому её следует сохранить. Если этого не сделать, то придётся перезагрузить устройство, чтобы вернуть значение к нужному состоянию.
-
Настроить сохранение dump-файла, записав следующее значение в файл:
core.%u.%e.%p
. Оно указывает, что файл дампа должен иметь префиксcore
, далее через точку должно идти название исполняемого файла, затем через точку его PID. Это можно сделать с помощью команды:devel-su sysctl -w kernel.core_pattern=/srv/shared/{orgName}/{appName}/data/core.%u.%e.%p
-
Запустить приложение обычным образом (через среду разработки или с помощью ярлыка). В случае его падения будет создан дамп в домашнем каталоге пользователя, от имени которого было запущено приложение.
-
Перенести дамп в сборочное окружение для исследования.
-
По окончании работ необходимо перезагрузить телефон или вручную восстановить настройку с помощью команды:
devel-su sysctl -w kernel.core_pattern='|/usr/sbin/omp-dumper --pid=%p --signal=%s --name=%e'