Отладка примера в Neovim

30 сентября 2026

ID 334892

Перед изучением сценария необходимо получить и установить SDK а также задать переменные окружения.

Последовательно выполнив приведенные в этом разделе инструкции, вы проведете отладку примера с использованием точки останова.

Подготовка к работе с Neovim и плагином vimspector

  1. Установите Neovim:

    sudo apt install neovim

  2. Создайте директорию для конфигураций Neovim:

    mkdir -p ~/.config/nvim

  3. Установите менеджер расширений Vim-plug для Neovim:

    curl -fLo ~/.local/share/nvim/site/autoload/plug.vim --create-dirs \

    https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim

  4. Установите пакет python3-pynvim, который служит клиентом и хостом плагинов для Neovim:

    apt install python3-pynvim

  5. Создайте файл конфигурации Neovim:

    nvim ~/.config/nvim/init.vim

  6. Добавьте в файл следующую конфигурацию:

    call plug#begin('~/.vim/plugged')

    Plug 'puremourning/vimspector'

    call plug#end()

    let g:vimspector_enable_mappings = 'HUMAN'

  7. Установите плагин 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.

Подготовка к запуску отладки

  1. Скопируйте директорию с исходным кодом примера ping в домашнюю директорию:

    cp -r /opt/KasperskyOS-Community-Edition-Qemu-<version>/examples/ping/ ~/kasperskyos_ping

  2. В файле client/src/client.c замените цикл на бесконечный:

    - for (i = 0; i < 5; ++i)

    + while (1)

    {

    value = ping(value);

    value = pong(value);

    }

  3. Создайте в корневой директории примера файл конфигурации .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 и путь к корневой директории проекта соответственно.

  4. Создайте в корневой директории примера файл setup, служащий скриптом для отладки в GDB, со следующим содержанием:

    set sysroot <path to project>/kasperskyos_ping/build/einit/sysroot-symbols

    set 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.

  5. Создайте в корневой директории примера файл 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 и путь к корневой директории примера соответственно.

  6. Находясь в корневой директории примера, соберите его образ для дальнейшей отладки:

    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

Работа с отладкой

  1. В отдельном терминале откройте файл client.c в Neovim:

    nvim client/src/client.c

  2. Запустите vimspector, нажав на клавишу отладки (обычно F5) или выполнив команду :call vimspector#Launch().

    В результате в окне терминала должен появиться текст "Initializing debug session KOS attach (Hello) (0)..".

  3. Ответьте на вопросы, появившиеся в нижней панели терминала:

    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");.

  4. Выберите строку value = ping(value); и установите на ней точку останова, нажав на клавишу F9 или выполнив команду :call vimspector#ToggleBreakpoint().

    В результате данная точка останова появится в списке всех точек останова программы, который можно получить с помощью команды :VimspectorBreakpoints .

    client.c:116 Line breakpoint - VERIFIED: {}

    value = ping(value);

    Чтобы выйти из окна, введите :q и нажмите на клавишу Enter.

  5. Несколько раз продолжите выполнение программы, нажав 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

    ...

  6. Измените значение переменной value. Для этого в разделе с переменными vimspector.Variables[0] выберите переменную value, затем нажмите комбинацию клавиш Enter + \ или кнопку Set в левом верхнем углу окна.

    В результате внизу окна появится строка ввода с текстом "New Value: 809".

  7. В качестве примера введите значение 2000 и нажмите Enter.

    В результате в терминале выведется следующее сообщение:

    [Client] Ping(2000), result = 2003

    [Client] Pong(2003), result = 2006

  8. Для завершения отладки введите команду :qa!нажмите на клавишу Enter в терминале Neovim, чтобы закрыть его.

Вам помогла эта статья?
Что нам нужно улучшить?
Спасибо за ваш отзыв, вы помогаете нам становиться лучше!
Спасибо за ваш отзыв, вы помогаете нам становиться лучше!