从 VS2017 附加到 docker 内部正在运行的进程

Attach to running process inside docker from VS2017

提问人:Tomáš Bezouška 提问时间:9/11/2017 最后编辑:Jack ZhaiTomáš Bezouška 更新时间:10/11/2023 访问量:3244

问:

有没有一种简单的方法可以从 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容器的教程 ?

C# Visual-Studio Docker 容器

评论

0赞 Jack Zhai 9/12/2017
根据本文档和一种情况,使用 vsdbg 将不同于 sshd: visualgdb.com/tutorials/linux/dockerstackoverflow.com/questions/44401483/...,如果可能,您可以查看它们的详细步骤。
0赞 Shrike 2/7/2018
你找到关于这个主题的任何信息了吗?我有一个类似的问题 - stackoverflow.com/questions/48661857/......

答:

0赞 Ivelin Ivanov 8/20/2019 #1

您可以尝试使用 gdbssh 进行调试, 但这会将进程视为本机/非托管进程。它基本上用于调试 C++ 应用程序。

对于远程调试托管进程(C#、VB、F# 等),可以使用“VS 远程调试工具”,但它们仅适用于 Windows。因此,目前无法在 Linux 容器上远程调试 C# 应用程序。 希望这能澄清事情。

0赞 ICodeGorilla 6/10/2020 #2

若要公开这些工具,必须安装远程调试工具。通常,使用 Windows 时,每个 Visual Studio 都有不同的版本,但这应该适用于 Visual Studio 的 2017 及更高版本。

https://learn.microsoft.com/en-us/visualstudio/debugger/remote-debugging-dotnet-core-linux-with-ssh?view=vs-2019

0赞 Nathan Carlson - MSFT 3/8/2023 #3

对于 VS 2017,有一篇关于如何进行高级容器附加的文章: 越野调试

对于 VS 2019 及更高版本,有一个 UI 可以支持此功能:附加到进程

0赞 Adán Escobar 3/17/2023 #4

我为我的 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
        }
    ]
}

**重要:

  • 记住使用远程服务器和容器内代码的位置进行更改。localhostremoteRoot
  • 启用对端口调试的访问,以便从本地访问

现在您可以在 vscode 中播放调试enter image description here