通过 docker 在 VS Code 中混合调试(C#、C++)

The*_*rew 5 debugging docker visual-studio-code

我们最近将开发从 Visual Studio 转移到 VS Code。我们的代码解决方案包含 .NET Core C#,它将计算交给 C++。在 Visual Studio 中,我们能够在 C# 和 C++ 之间无缝调试。

我们最初转而在虚拟机中运行多项目解决方案并使用VS Code 的远程开发功能。我们使用两种启动配置:

{
            "name": "(gdb) Attach",
            "type": "cppdbg",
            "request": "attach",
            "program": "/usr/share/dotnet/dotnet",
            "processId": "${command:pickProcess}",
            "additionalSOLibSearchPath": "${workspaceFolder}/src/build/Debug/Cpp/",
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ]
        },
        {
            "name": "Run C#",
            "type": "coreclr",
            "request": "launch",
            // If you have changed target frameworks, make sure to update the program path.
            "program": "${workspaceFolder}/src/AppProject/bin/Debug/netcoreapp2.2/AppProject.dll",
            "args": [],
            "cwd": "${workspaceFolder}/src/AppProject",
            "stopAtEntry": false,
            // Enable launching a web browser when ASP.NET Core starts. For more information: https://aka.ms/VSCode-CS-LaunchJson-WebBrowser
            "env": {
                "ASPNETCORE_ENVIRONMENT": "Development",
                "EnvironmentName": "Development",
                "LD_LIBRARY_PATH": "${workspaceFolder}/src/build/Release/Cpp/;$LD_LIBRARY_PATH"
            },
            "sourceFileMap": {
                "/Views": "${workspaceFolder}/Views"
            }
        }
}
Run Code Online (Sandbox Code Playgroud)

首先运行“Run C#”,然后运行“(gdb) Attach”并选择dotnet要附加的进程。这很有效,让我们能够从 C# 过渡到 C++。

我们现在已经转移到 Docker 设置,其中源文件被安装到带有内置构建工具的容器中(如 VS Code 文档中所述)。这大致是我们的devcontainer.json

{
    "image": [custom image in a private code repository],
    "forwardPorts": [various ports to serve web interfaces],
    "runArgs": [
        "--cap-add=SYS_PTRACE",
        "--security-opt",
        "seccomp=unconfined"
    ],
    "extensions": [
        "ms-vscode.cpptools",
        "ms-vscode.cmake-tools",
        "hbenl.vscode-test-explorer",
        "derivitec-ltd.cmake-test-adapter",
        "ms-dotnettools.csharp",
        "fernandoescolar.vscode-solution-explorer",
        "derivitec-ltd.vscode-dotnet-adapter"
      ],
      "mounts": [
          "source=${localEnv:HOME}/.gitconfig,target=/root/.gitconfig,type=bind,consistency=cached",
          "source=${localEnv:HOME}/.ssh,target=/root/.ssh,type=bind,consistency=cached"
      ]
  }
Run Code Online (Sandbox Code Playgroud)

在此设置中,我们已经能够成功地分别调试 C# 和 C++ 代码,但是上述运行 C# 项目并在其后附加 GDB 的流程无法按预期工作。C# 进程退出,而“(gdb) Attach”调用启动多个进程,这些进程在启动时会遇到各种异常。我已将完整输出粘贴到 Pastebin

我发现的许多建议都令人困惑,原因如下:

我应该如何使用 VS Code 调试在 docker 容器中运行的 C# 和 C++?