Прикручиваем удаленную отладку к VSCode. ПО собрано с тулчейном buildroot-a
1. Для удобства работы пользоваться будем тулчейн-файлом, который генерируется buildroot-ом. Находится он где-то вот тут:
buildroot_out_folder/host/share/buildroot/toolchainfile.cmakeВ моем случае это будет путь вида:
/home/valenti/Development/Embedded/exercise8/build_orange_zero_image/host/share/buildroot/toolchainfile.cmake2. В VSCode настраиваем все, чтобы можно было работать с CMakePresets - файлами:
https://github.com/microsoft/vscode-cmake-tools/blob/main/docs/cmake-presets.md
3. Создаем себе пресет для кросс-сборки приложения:
{
"version": 2,
"configurePresets": [
{
"name": "buildroot_orange_pi_zero",
"displayName": "Orange Pi Zero buildroot custom toolchain",
"description": "Sets orangepi custom buiild toolchain",
"generator": "Unix Makefiles",
"binaryDir": "${sourceDir}/build/${presetName}",
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug",
"CMAKE_TOOLCHAIN_FILE": "/home/valenti/Development/Embedded/exercise8/build_orange_zero_image/host/share/buildroot/toolchainfile.cmake",
"CMAKE_INSTALL_PREFIX": "${sourceDir}/install/${presetName}"
}
}
]
}
4. Собираем, в теории сборка должна пройти безболезненно. По ходу докидываем в образ системы необходимые зависимости, собираем, повторяем до готовности образа. На всякий случай проверяем, как собрался итоговый образ5. По окончанию сборки закидываем собранный бинарь на целевую железку.
6. Настраиваем в VSCode файл для запуска дебаггера:
Создаем launch.json и в него накидываем что-то вроде:
{
"version": "0.2.0",
"configurations": [
{
"name": "Test server ARM Orange Zero",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceRoot}/build/buildroot_orange_pi_zero/app_test_drogon_server",
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"miDebuggerServerAddress": "192.168.0.116:8876", // тут 8876 это порт, на котором будет поднят gdbserver
"miDebuggerPath": "/home/valenti/Development/Embedded/exercise8/build_orange_zero_image/host/bin/arm-buildroot-linux-uclibcgnueabihf-gdb",
"externalConsole": true,
"MIMode": "gdb",
"stopAtConnect": true,
"setupCommands": [
{
"text": "source /home/valenti/Development/Embedded/exercise8/build_orange_zero_image/staging/usr/share/buildroot/gdbinit"
},
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description": "Set Disassembly Flavor to Intel",
"text": "-gdb-set disassembly-flavor intel",
"ignoreFailures": true
}
]
}
],
"compounds": []
}
На целевом устройствезапускаем бинарь с поднятым gdbserver-ом:
gdbserver :8876 app_test_drogon_serverВ VSCode запускаем отладку по
F5 и смотрим в консоль отладчика:
T
hread 2 "DrogonIoLoop" hit Break
point
2,
JsonCtrl::asyncHandleHttpRequest(std::shared_ptr<drogon::HttpRequest> const&, std::function<void (std::shared_ptr<drogon::HttpResponse> const&)>&&) (this=0x5b9920, req=..., callback=...) at /home/valenti/Development/Embedded/dragon_playground/main.cpp:18Собственно, можем удаленно отлаживать
18 spdlog::info("Handlded get request to json!");
устройство