Это руководство предоставляет основные рекомендации по использованию ndk-gdb для отладки VR-проектов с нативным кодом и дополняет соответствующую документацию Android Studio.
В Android NDK входит мощный инструмент для отладки — ndk-gdb, представляющий собой небольшой shell-скрипт-оболочку GDB. Использование ndk-gdb из командной строки добавляет в процесс отладки удобные функции. Например, это позволяет добавлять точки останова, перемещаться по коду и проверять переменные.
Создание точек останова
Остановка на функции
(gdb) break SomeFunctionName()
или
(gdb) break SomeClass::SomeMethod()
Пример использования:
(gdb) break OVR::VrCubeWorld::Frame(OVR::VrFrame const&)
Breakpoint 2 at 0xf3f56118: file jni/../../../Src/VrCubeWorld_Framework.cpp, line 292.
Остановка по строке файла
(gdb) break SomeFile.cpp:256
Условные точки останова
Добавьте if <условие> в конец команды остановки.
Пример использования:
(gdb) break OVR::VrCubeWorld::Frame(OVR::VrFrame const&) if vrFrame.PredictedDisplayTimeInSeconds > 24250.0
Breakpoint 6 at 0xf3f58118: file jni/../../../Src/VrCubeWorld_Framework.cpp, line 292.
Остановка в текущем месте выполнения
Пример использования:
(gdb) break OVR::VrCubeWorld::Frame(OVR::VrFrame const&) if vrFrame.PredictedDisplayTimeInSeconds > 24250.0
Breakpoint 6 at 0xf3f58118: file jni/../../../Src/VrCubeWorld_Framework.cpp, line 292.
Остановка в текущем месте выполнения
Когда приложение активно работает, нажмите Control-C, чтобы немедленно остановить выполнение и вызвать приглашение gdb.
Пошаговое выполнение кода
Переход через шаг
(gdb) next
или
(gdb) n
Вход в шаг
(gdb) step
или
(gdb) s
Продолжение выполнения программы
(gdb) continue
или
(gdb) c
Вывод данных
Вывод структуры
Чтобы улучшить читаемость, можно включить режим красивого вывода:
(gdb) set print pretty on
Для вывода структуры:
(gdb) print SomeStructVariable
Пример использования:
(gdb) print currentRotation
$1 = {
x = 23185.9961,
y = 23185.9961,
z = 0,
static ZERO = {
x = 0,
y = 0,
z = 0,
static ZERO = <same as static member of an already seen type>
}
}
Форматированный вывод (printf)
Пример использования:
(gdb) printf "x = %f\n", currentRotation.x
x = 23185.996094
Команды для точек останова
Точки останова в GDB могут автоматически выполнять определенные команды при их срабатывании. Это удобно для вставки выводов (print statements) без перекомпиляции кода или для изменения данных в ключевых точках программы без полной остановки выполнения. Эти команды задаются с помощью commands.
Вы можете указать номер точки останова в виде аргумента; если аргумент отсутствует, используется последняя созданная точка останова. После ввода команды вы увидите строки, начинающиеся с >, где можно вводить GDB-команды (по одной на строку), которые будут выполнены при срабатывании точки останова. Завершите ввод последовательности команд, напечатав end.
В следующем примере мы создаем точку останова, которая при срабатывании автоматически выводит значение локальной переменной и продолжает выполнение программы:
(gdb) break OVR::VrCubeWorld::Frame(OVR::VrFrame const&)
Breakpoint 1 at 0xf3f56118: file jni/../../../Src/VrCubeWorld_Framework.cpp, line 292.
(gdb) commands
Type commands for breakpoint(s) 1, one per line.
End with a line saying just "end".
>silent
>printf "time = %f\n", vrFrame.PredictedDisplayTimeInSeconds
>continue
>end
Текстовый пользовательский интерфейс (Text User Interface, TUI)
Чтобы включить или отключить TUI, нажмите CTRL+x, а затем CTRL+a.