提问人:Tomáš Bezouška 提问时间:9/11/2017 最后编辑:Jack ZhaiTomáš Bezouška 更新时间:10/11/2023 访问量:3244
从 VS2017 附加到 docker 内部正在运行的进程
Attach to running process inside docker from VS2017
问:
有没有一种简单的方法可以从 Visual Studio 调试在远程主机上的 Linux 容器内运行的进程?
想象一下这样一种场景,我们在某个远程机器上部署了多个服务,在 docker 容器 - 开发环境中运行。在测试过程中,我们检测到其中一个服务的内部状态变得异常,需要弄清楚其中发生了什么。我们不想在本地进行,因为我们可能无法模拟该场景。docker-compose up
相反,我们希望附加到容器内正在运行的进程。
我读了几篇关于如何做到这一点的文章,但它们要么是关于 Windows 容器 (https://www.richard-banks.org/2017/02/debug-net-in-windows-container.html),要么只是令人困惑(例如,我是否需要安装 sshd 才能从 VS 连接到它?我是否需要按照此处的概述安装 vsdbg https://github.com/Microsoft/generator-docker/issues/130 ?
我尝试将 vsdbg 与 ssh 一起安装到容器中,但 Visual Studio 无法找到任何远程连接(在调试 -> 附加到进程中)。
是否有专门针对VS2017和远程调试以及Docker Linux容器的教程 ?
答:
您可以尝试使用 gdb
和 ssh
进行调试,
但这会将进程视为本机/非托管进程。它基本上用于调试 C++ 应用程序。
对于远程调试托管进程(C#、VB、F# 等),可以使用“VS 远程调试工具”,但它们仅适用于 Windows。因此,目前无法在 Linux 容器上远程调试 C# 应用程序。 希望这能澄清事情。
若要公开这些工具,必须安装远程调试工具。通常,使用 Windows 时,每个 Visual Studio 都有不同的版本,但这应该适用于 Visual Studio 的 2017 及更高版本。
对于 VS 2017,有一篇关于如何进行高级容器附加的文章: 越野调试
对于 VS 2019 及更高版本,有一个 UI 可以支持此功能:附加到进程
我为我的 django 应用程序做了这样的事情。
也许你的代码不是在 Python 中,但逻辑是一样的:
- 在调试模式下运行服务器
- 配置以将本地代码映射到远程代码
- 在 VSCode 中启动调试
在 docker 中创建一个脚本,该脚本根据 de 值 APP_MODE_DEBUG:
if [[ -n "${APP_MODE_DEBUG-}" && "$APP_MODE_DEBUG" == "yes" ]];then
echo 'WARNING: running in dev mode'
echo 'IMPORTANT: remember start server with vscode debug'
pip install debugpy -t /tmp && python /tmp/debugpy --wait-for-client --listen 0.0.0.0:5678 manage.py runserver 0.0.0.0:8000
else
echo 'running in prod mode'
gunicorn myapp.conf.wsgi:application --conf /app/server_conf.py
fi
如果服务器在调试模式下启动,则需要在 VSCode 中使用如下配置进行 Play Debug:
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "MyApp: Debug",
"type": "python",
"request": "attach",
"connect": {
"host": "localhost",
"port": 5678
},
"pathMappings": [
{
"localRoot": "${workspaceFolder}/MyApp",
"remoteRoot": "/app"
}
],
"justMyCode": false
}
]
}
**重要:
- 记住使用远程服务器和容器内代码的位置进行更改。
localhost
remoteRoot
- 启用对端口调试的访问,以便从本地访问
评论