Отладка примера в Neovim
Перед изучением сценария необходимо получить и установить SDK а также задать переменные окружения.
Последовательно выполнив приведенные в этом разделе инструкции, вы проведете отладку примера с использованием точки останова.
Подготовка к работе с Neovim и плагином vimspector
- Установите Neovim:
sudo apt install neovim
- Создайте директорию для конфигураций Neovim:
mkdir -p ~/.config/nvim
- Установите менеджер расширений Vim-plug для Neovim:
curl -fLo ~/.local/share/nvim/site/autoload/plug.vim --create-dirs \
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
- Установите пакет python3-pynvim, который служит клиентом и хостом плагинов для Neovim:
apt install python3-pynvim
- Создайте файл конфигурации Neovim:
nvim ~/.config/nvim/init.vim
- Добавьте в файл следующую конфигурацию:
call plug#begin('~/.vim/plugged')
Plug 'puremourning/vimspector'
call plug#end()
let g:vimspector_enable_mappings = 'HUMAN'
- Установите плагин c помощью команды
:PlugInstallв терминале Neovim.При возникновении ошибки "not an editor command pluginstall", выполните команду
:source ~/.config/nvim/init.vimВ результате в терминале Neovim должно появиться сообщение следующего вида:
Updated. Elapsed time: 2.336718 sec.[=]- Finishing ... Done!- vimspector: Already up to date.Чтобы выйти из окна, введите :
qи нажмите на клавишуEnter.
Подготовка к запуску отладки
- Скопируйте директорию с исходным кодом примера ping в домашнюю директорию:
cp -r /opt/KasperskyOS-Community-Edition-Qemu-<version>/examples/ping/ ~/kasperskyos_ping
- В файле client/src/client.c замените цикл на бесконечный:
- for (i = 0; i < 5; ++i)+ while (1){value = ping(value);value = pong(value);} - Создайте в корневой директории примера файл конфигурации .vimspector.json для отладки в GDB со следующим содержанием:
{
"adapters": {
"kos-gdb": {
"name": "kos-gdb",
"command": [
"/opt/KasperskyOS-Community-Edition-Qemu-<version>/toolchain/bin/debug_adapter",
"--gdb-path",
"/opt/KasperskyOS-Community-Edition-Qemu-<version>/toolchain/bin/aarch64-kos-gdb",
"--transport",
"stdio"
]
}
},
"configurations": {
"KOS attach (Hello)": {
"default": true,
"adapter": "kos-gdb",
"filetypes": [ "c", "cpp" ],
"configuration": {
"request": "attach",
"name": "Attach and debug",
"gdbServer": "tcp::12345",
"useExtendedRemote": true,
"setupCommands": [
{
"description": "Load gdb_init",
"text": "source <path to project>/gdb_init",
"ignoreFailures": false
}
],
"setupServerCommands": [
{
"description": "Load setup script",
"text": "source <path to project>/setup",
"ignoreFailures": false
}
]
}
}
}
}
Замените параметры
<version>и<path to project>на версию SDK и путь к корневой директории проекта соответственно. - Создайте в корневой директории примера файл setup, служащий скриптом для отладки в GDB, со следующим содержанием:
set sysroot <
path to project>/kasperskyos_ping/build/einit/sysroot-symbolsset solib-search-path /opt/KasperskyOS-Community-Edition-Qemu-<version>/sysroot-aarch64-kos
set osabi auto
set scheduler-locking off
set schedule-multiple on
set follow-fork-mode parent
set follow-exec-mode same
set detach-on-fork off
monitor exec kl.ExecMgrEntity
catch exec
continue
detach inferiors 1
remove-inferiors 1
monitor exec Client.1
catch exec
continue
b main
continue
Замените параметр
<version>на версию SDK. - Создайте в корневой директории примера файл gdb_init , служащий скриптом для инициализации отладки в GDB, со следующим содержанием:
shell rm -rf <
path to project>/build/einit/sysroot-symbols/shell mkdir <
path to project>/build/einit/sysroot-symbols/shell find -L <
path to project>/build -type f -executable | xargs -I {} cp {} <path to project>/build/einit/sysroot-symbols/shell find -L <
path to project>/build -type f -executable | xargs -I {} /opt/KasperskyOS-Community-Edition-Qemu-<version>/toolchain/bin/cmake -DBINARY={} -DBUILD_ID_DIR=<path to project>/build/sysroot-symbols/ -P /opt/KasperskyOS-Community-Edition-Qemu-<version>/toolchain/share/cmake/Modules/platform/building/build-id.cmake 2> /dev/nullЗамените параметры
<version>и<path to project>на версию SDK и путь к корневой директории примера соответственно. - Находясь в корневой директории примера, соберите его образ для дальнейшей отладки:
cmake -B build -D CMAKE_TOOLCHAIN_FILE="$KOSCEDIR/toolchain/share/toolchain-aarch64-kos.cmake" -D CMAKE_BUILD_TYPE=Debug && cmake --build build --target gdbsim
В результате сборки в терминале выведется следующее сообщение:
[KDBG] Waiting for GDB connection infinitely
Работа с отладкой
- В отдельном терминале откройте файл client.c в Neovim:
nvim client/src/client.c
- Запустите vimspector, нажав на клавишу отладки (обычно F5) или выполнив команду
:call vimspector#Launch().В результате в окне терминала должен появиться текст "
Initializing debug session KOS attach (Hello) (0)..". - Ответьте на вопросы, появившиеся в нижней панели терминала:
throw: Break on Catch throw (Y/N/default: Y)? Y
catch: Break on Catch catch (Y/N/default: N)? N
rethrow: Break on Catch rethrow (Y/N/default: N)? N
В результате выполнение программы остановится на строке
fprintf(stderr, "Hello I'm client\n");. - Выберите строку
value = ping(value);и установите на ней точку останова, нажав на клавишу F9 или выполнив команду:call vimspector#ToggleBreakpoint().В результате данная точка останова появится в списке всех точек останова программы, который можно получить с помощью команды
:VimspectorBreakpoints.client.c:116 Line breakpoint - VERIFIED: {}
value = ping(value);
Чтобы выйти из окна, введите :
qи нажмите на клавишуEnter. - Несколько раз продолжите выполнение программы, нажав F5 или выполнив команду
:call vimspector#Continue().В результате в терминале с запущенным образом появятся следующие сообщения:
Hello I'm client
[Client] Ping(777), result = 780
[Client] Pong(780), result = 783
[Client] Ping(783), result = 786
[Client] Pong(786), result = 789
...
- Измените значение переменной value.
Для этого в разделе с переменнымиvimspector.Variables[0]выберите переменную value, затем нажмите комбинацию клавиш Enter + \ или кнопку Set в левом верхнем углу окна.В результате внизу окна появится строка ввода с текстом "
New Value: 809". - В качестве примера введите значение 2000 и нажмите Enter.
В результате в терминале выведется следующее сообщение:
[Client] Ping(2000), result = 2003
[Client] Pong(2003), result = 2006
- Для завершения отладки введите команду
:qa!нажмите на клавишуEnter в терминале Neovim, чтобы закрыть его.