docker - 通过 docker 在 VS Code 中混合调试(C#、C++)
问题描述
我们最近将我们的开发从 Visual Studio 转移到了 VS Code。我们的代码解决方案包含将计算交给 C++ 的 .NET Core C#。在 Visual Studio 中,我们能够在 C# 和 C++ 之间进行无缝调试。
我们最初转向在 VM 中运行多项目解决方案并使用 VS Code 的远程开发功能。我们使用两种 Launch 配置:
{
"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"
}
}
}
首先运行“运行 C#”,然后运行“(gdb)附加”并选择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"
]
}
在此设置中,我们已经能够成功地分别调试 C# 和 C++ 代码,但是上述运行 C# 项目并在其后附加 GDB 的流程无法按预期工作。C# 进程退出,而“(gdb) Attach”调用启动多个进程,这些进程在启动时遇到各种异常。我已将完整输出粘贴到 Pastebin。
我发现的许多建议都很困惑,原因是:
- 遗留方法,例如直接调用docker
- 将源代码打包到 docker 容器而不是挂载的替代设置(用于在 docker 中调试 .NET Core 的 VS Code 文档)
- 替代设置,其中构建工具位于 docker 容器中,但 VS Code 通过 SSH 与 docker 容器通信,而不是使用文档中推荐的 dev 容器方法(Microsoft blog post on development C++ with VS Code and docker)
- C++ 似乎对调试有特殊要求,尤其是涉及到 docker
- devcontainer.json 参考中的
runArgs
描述:例如, "runArgs": [ "--cap-add=SYS_PTRACE", "--security-opt", "seccomp=unconfined" ] 允许基于 ptrace 的调试器(如 C++)在容器中工作。
- devcontainer.json 参考中的
- VS Code 文档建议在使用远程开发工具时调试应该完全像本机那样工作(来自 VS Code 文档的“在容器中调试”)
我应该如何使用 VS Code 调试在 docker 容器中运行的 C# 和 C++?
解决方案
推荐阅读
- php - 自定义查询响应数组
- flowtype - 在项目特定的命名导出上添加流类型注释的好习惯是什么
- haskell - 如何将 Map ByteString ByteString 转换为 Map String String 并打印
- javascript - Angular:制作材料步进器所需的按钮切换组
- vba - Sharepoint 中的 MS-Access - 有哪些可用数据?
- gitahead - Gitahead 的静默命令行安装?
- c# - WebClient 仅针对该网站返回 403 错误?
- docker-compose - Azure IoT Edge - 从模块到主机网络设备的通信
- java - 为基于 testng 的框架进行测试用例清理的最佳方法
- c# - Quartz.net Core 中的依赖注入找不到已注册的服务