Мы недавно перевели нашу разработку с Visual Studio на VS Code. Наше кодовое решение содержит. NET Core C#, который передает вычисления в C ++. В Visual Studio мы смогли беспрепятственно отлаживать между C# и C ++.
Мы изначально перешли к запуску многопроектного решения на ВМ и использованию функций удаленной разработки VS Код. Мы используем две конфигурации запуска:
{
"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 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"
]
}
. В этой конфигурации мы смогли успешно отладить код C# и C ++ отдельно, но описанный выше поток запуска проекта C# и присоединение GDB после того, как оно не работает, как ожидалось. Процесс C# завершается, а вызов «(gdb) Attach» запускает несколько процессов, которые запускаются с различными исключениями при запуске. Я вставил полный вывод в Pastebin .
Многие советы, которые я нашел, сбиты с толку из-за:
- устаревших методов, таких как вызов docker напрямую ( проблема omnisharp / omnisharp-vscode при отладке в docker)
- альтернативных настроек, когда исходный код упакован в docker контейнер, а не смонтирован ( VS Код документации для отладки. NET Core в docker)
- альтернативные установки, где инструменты сборки находятся в контейнере docker, но VS Code связывается с контейнером docker через S SH вместо использования подхода контейнера dev, рекомендованного в документации ( сообщение в блоге Microsoft по разработке C ++ с VS Code и docker)
- C ++, казалось бы, предъявляющее особые требования к отладке, особенно там, где docker относится
- Описание
runArgs
в devcontainer. json ссылка : Например, "runArgs": ["--cap-add = SYS_PTRACE "," --security-opt "," seccomp = неограниченный "] позволяет отладчикам на основе ptrace, таким как C ++, работать в контейнере.
- VS Документы кода, предполагающие, что отладка должна работать точно так же, как и изначально при использовании инструментов удаленной разработки ( «Отладка в контейнере» из VS Code docs )
Как отлаживать C# и C ++, работающие в контейнере docker с использованием кода VS?