繁体   English   中英

Visual Studio Code - 远程调试 Bazel C++ - 无法读取文件 'vscode-remote://dev- 文件

[英]Visual Studio Code - Remote Debugging Bazel C++ - Unable to read file 'vscode-remote://dev- file

我正在尝试在 docker 中对 bazel 项目进行远程调试。 本地插件:远程开发 Docker 插件(在 devcontainer.json 中定义):ms-vscode.cpptools

我的launch.json

{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Debug",
      "type": "cppdbg",
      "MIMode": "gdb",
      "request": "launch",
      "args": [],
      "stopAtEntry": true,
      "cwd": "${workspaceFolder}",
      "program": "/root/.cache/bazel/_bazel_root/e53bbb0b0da4e26d24b415310219b953/execroot/tf_serving/bazel-out/k8-dbg/bin/tensorflow_serving/fplugin/fserve_cc",
      "externalConsole": false,
    }
  ]
}

但是我收到一个错误:

Unable to open 'fserve.cc': Unable to read file 'vscode-remote://dev-container+2f55736572732f6d67756d6f77736b2f776f726b2f6f766d732d63/proc/self/cwd/tensorflow_serving/fplugin/fserve.cc

在本地开发中,我会添加 sourceFileMap,但它似乎不适用于远程 docker 开发。 有任何想法吗?

当您尝试使用 bazel 进行编译时,您将有 4 个软链接(bazel-bin, bazel-{source-folder}, bazel-out, bazel-testlog)修改此属性 wi

"cwd": "${workspaceFolder}/bazel-",

我不确定您的问题是由于远程调试造成的。 我相信无论您是否在远程环境中,以下信息都将起作用。

Bazel 在项目的根文件夹中生成一些包含有用数据的符号链接(更多信息 请参见文档):

  • bazel-bin是输出目录中文件夹的符号链接,其中包含为您运行的构建的最新配置生成的代码和二进制文件。
  • bazel-{folder-name}是 execRoot 的符号链接,这是 bazel 查看项目源代码的方式。 {folder-name}是您的项目所在文件夹的名称。
  • bazel-out是 bazel 输出根的符号链接。
  • bazel-testlog是测试运行输出的符号链接

如果您没有使用 bazel 的运行文件库

在正确的位置提供VSCode与来源,修改"cwd"属性中launch.json到:

"cwd": "${workspaceFolder}/bazel-{folder-name}",`

如果您使用的是运行文件

如果您的程序需要其任何依赖项中的data属性中的文件,则您正在使用运行文件

首先,将"cwd"设置为二进制文件的运行文件树的根,然后以将当前工作目录映射到 execRoot 符号链接的方式设置"sourceFileMap" 对我来说(在 linux 上), /proc/self/cwd映射正确,但对你来说可能不是这样。 我能够说我弄错了,因为 VSCode 抱怨无法读取/proc/self/cwd/external/external-project/src/file.cpp的文件。

"cwd": "${workspaceFolder}/bazel-bin/path/to/executable/executable.runfiles/{workspace-name}`,
"sourceFileMap": {
    "/proc/self/cwd": "${workspaceFolder}/bazel-{folder-name}`,
},

{workspace-name}可以在WORKSPACE找到,它看起来像workspace(name = "my-project") 如果该文件中没有定义工作区名称,则默认为__main__

我可能还建议将"program"属性更改为更方便的位置。 如果您做的最后一件事是使用 bazel 构建二进制文件,则可以在bazel-bin/path/to/executable/executable找到构建的可执行bazel-bin/path/to/executable/executable

一个完整的例子:

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) Launch Debug",
            "type": "cppdbg",
            "request": "launch",
            // path to the most recently built version of executable
            // this should be built with `bazel build -c dbg //path/to:executable`
            "program": "${workspaceFolder}/bazel-bin/path/to/executable/executable",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}/bazel-bin/path/to/executable/executable.runfiles/{workspace-name}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],
            "sourceFileMap": {
                "/proc/self/cwd": "${workspaceFolder}/bazel-{folder-name}"
            }
        }
    ]
}

这篇有用的帖子(还展示了如何使用tasks.json自动构建可执行文件)中tasks.jsonhttps : tasks.json /

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM