【发布时间】:2018-06-18 13:33:01
【问题描述】:
总结
我正在尝试在 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' 的problemMatcher,正如那里所建议的那样。这没有效果。
我认为问题可能是 docker exec 命令在前台运行,而 VSCode 正在等待它返回,所以我尝试使用 -d 执行 docker exec (分离模式,在后台运行) ,或者只是在 docker 命令的末尾添加一个“&”。同样,没有效果。
谁能建议我可以做些什么来摆脱这个烦人的 10 秒等待?
非常感谢。
【问题讨论】:
标签: debugging docker visual-studio-code gdbserver vscode-tasks