概括
我正在尝试在 docker 映像(Ubuntu)中调试 C++ 程序,同时在我的主机系统(OS X)上使用 VSCode 作为 IDE。在对 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 连接到 docker 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非常相似,所以我尝试使用带有 'activeOnStart:true' 的问题匹配器,正如那里所建议的那样。这没有效果。
我认为问题可能是 docker exec 命令在前台运行,而 VSCode 正在等待它返回,所以我尝试使用 -d 执行 docker exec (分离模式,在后台运行),或者只是在 docker 命令的末尾添加一个“&”。再次,没有效果。
谁能建议我可以做些什么来摆脱这个烦人的 10 秒等待?
非常感谢。