Резюме
Я пытаюсь отлаживать программу на C ++ в образе докера (Ubuntu), используя VSCode в качестве IDE в моей хост-системе (OS X). После различных действий с задачами gdbserver и VSCode теперь я могу успешно запустить отладчик, но каждый раз, когда я запускаю сеанс отладки, VSCode зависает на 10 секунд, а затем сообщает сообщение об ошибке:
Не удается отследить preLaunchTask docker gdb.
Если я щелкну по этой ошибке, я могу нормально отлаживать, но это 10-секундное ожидание каждый раз, когда я отлаживаю, сильно расстраивает.
Подробности
Мой образ Docker запускается следующим образом, поэтому мой исходный код смонтирован в каталоге app. Настройки безопасности - это те, которые я нашел в другом месте на Stack Overflow, необходимые для разрешения gdbserver:
docker run --cap-add=SYS_PTRACE --security-opt seccomp=unconfined -it -v "$(pwd):/app" -w "/app" -p 9091:9091 {imageName} /bin/bash
И когда я запускаю сеанс отладки на хосте, я использую эту команду запуска, подключаю локальный gdb к докеру gdbserver и выполняю задачу перед запуском:
{
"version": "0.2.0",
"configurations": [
{
"name": "Remote unit test",
"type": "cppdbg",
"request": "launch",
"program": "./tests/ConfigurationTest.cpp_TestRunner",
"miDebuggerServerAddress": "localhost:9091",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceRoot}",
"environment": [],
"externalConsole": true,
"MIMode": "gdb",
"preLaunchTask": "docker gdb"
}
]
}
Это определение предстартовой задачи; он использует docker exec, чтобы убить любой существующий gdbserver и запустить новый в соответствующем исполняемом файле:
{
"version": "2.0.0",
"tasks": [
{
"label":"docker gdb",
"command": "docker exec {containerName} /bin/bash -c \"pkill gdbserver; gdbserver localhost:9091 ./tests/ConfigurationTest.cpp_TestRunner\"",
"isBackground": true,
"type": "shell"
}
]
}
Когда я запускаю сеанс отладки, я немедленно получаю следующий результат, который и ожидался:
Процесс ./tests/ConfigurationTest.cpp_TestRunner создан; pid = 1167
Прослушивание порта 9091
На данный момент gdbserver готов к работе, и я бы хотел, чтобы VSCode запустил свой gdb. Но вместо этого VSCode ждет 10 секунд, прежде чем появится диалоговое окно с сообщением «PreLaunchTask« docker gdb »не может быть отслежен». Если я нажму «Все равно отладить», сеанс отладки возобновится, как ожидалось, и, похоже, работает нормально.
Что я пробовал
Время ожидания 10 секунд очень похоже на https://github.com/Microsoft/vscode/issues/37997, поэтому я попытался использовать taskMatcher с activeOnStart: true, как было предложено там. Это не подействовало.
Я подумал, что, возможно, проблема заключалась в том, что команда docker exec работала на переднем плане, а VSCode ждал ее возврата, поэтому я попытался выполнить docker exec с -d (режим отсоединения, работает в фоновом режиме) или просто добавление символа «&» в конец команды докера. Опять же, никакого эффекта.
Может ли кто-нибудь подсказать, что я могу сделать, чтобы избавиться от этого надоедливого 10-секундного ожидания?
Большое спасибо.