5

概括

我正在尝试在 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 秒等待?

非常感谢。

4

2 回答 2

7

我今天遇到了同样的问题,我试图用调试器运行 Mocha 测试,而 vscode 正在等待调试器完成 preLaunch 任务,这与我需要的相反——任务暴露了调试器,所以我需要它在“背景”中运行-尽管如此,这个配置为我修复了它。

启动.json

{
    "version": "0.2.0",
    "configurations": [
    {
      "type": "node",
      "request": "attach",
      "name": "Docker: Attach to Mocha",
      "port": 5858,
      "address": "localhost",
      "localRoot": "${workspaceFolder}/server",
      "remoteRoot": "/usr/src/app/server",
      "protocol": "inspector",
      "preLaunchTask": "mocha-docker-debug"
    }
    ]
}

任务.json

{
  // See https://go.microsoft.com/fwlink/?LinkId=733558
  // for the documentation about the tasks.json format
  "version": "2.0.0",
  "tasks": [
      {
        "label": "mocha-docker-debug",
        "type": "shell",
        "command": "docker exec up-ibe-server-node npm run test-debug",
        "group": "test",
        "isBackground": true,
        "presentation": {
          "reveal": "never"
        },
        "problemMatcher": {
          "owner": "mocha",
          "fileLocation": "relative",
          "pattern": [
            {
              "regexp": "^not\\sok\\s\\d+\\s(.*)$"
            },
            {
              "regexp": "\\s+(.*)$",
              "message": 1
            },
            {
              "regexp": "\\s+at\\s(.*):(\\d+):(\\d+)$",
              "file": 1,
              "line": 2,
              "column": 3
            }
          ],
          "background": {
              "activeOnStart": true,
              "beginsPattern":{
                  "regexp": "mocha*"
              },
              "endsPattern":{
                  "regexp": "Debugger listening*"
              }
          },
        }
      }
  ]
}

这里要注意的主要事情是isBackground标志beginsPattern和正则endsPattern表达式,这告诉“父”启动任务,当 xxx 从“子”打印到控制台时,它就完成了,vscode 可以继续执行实际任务。

鉴于您正在运行 C++ 应用程序,这可能不是您遇到的确切问题,但我认为原因相同。

于 2018-05-30T14:40:21.317 回答
0

我找到了一个非常实用的解决方案。

我使用以下 preLaunchTask 不需要 isBackground 和正则表达式模式(检测任务执行的开始和结束),只需将 gdbserver 作为后台命令/作业启动并结合一点睡眠:

{
            "label": "Start GDB remote debugger",
            "type": "shell",
            "options": {
                "cwd": "${workspaceRoot}/"
            },
            "presentation": {
                "echo": true,
                "reveal": "always",
                "focus": false,
                "panel": "shared",
                "revealProblems": "onProblem"
            },
            "command": "clear;./ssh.py 'cd /opt/bin/;(nohup gdbserver localhost:6666 myapp &);sleep 1'",
            "problemMatcher": []
        },

整个 gdbserver 配置可以在这里找到

根据我的经验,即使通过 vpn 进行慢速连接,这也很稳定。

于 2020-12-04T20:17:48.143 回答