在 Windows 容器中运行 Visual Studio 远程调试器(由 Docker 管理)

Posted

技术标签:

【中文标题】在 Windows 容器中运行 Visual Studio 远程调试器(由 Docker 管理)【英文标题】:Running Visual Studio Remote Debugger in Windows Container (Docker managed) 【发布时间】:2016-07-25 00:55:27 【问题描述】:

我尝试在 Windows Server 2016 TP4 上的 Windows 容器 中运行 Visual Studio 远程调试器。由于它在容器内运行,因此没有 UI。

我尝试通过以下方式运行远程调试器:

 .\msvsmon.exe /nostatus /silent /nosecuritywarn /nofirewallwarn /noclrwarn /port 4020

我以管理员用户(nt authority\system)执行上述操作。 这在主机上工作正常,但在容器内不起作用。 Windows 事件日志显示以下错误事件。

Msvsmon was unable to start a server named "`6D2D071453C5:4020`". 
The following error occurred: The parameter is incorrect. 

完整的事件日志:

Get-EventLog -LogName Application -EntryType Error | format-list

Index              : 1718
EntryType          : Error
InstanceId         : 3221226473
Message            : The description for Event ID '-1073740823' in Source 'Visual Studio Remote Debugger' cannot be found.  The local computer may not have the necessary registry information or message DLL
                     files to display the message, or you may not have permission to access them.  The following information is part of the event:'Msvsmon was unable to start a server named
                     '6D2D071453C5:4020'. The following error occurred: The parameter is incorrect.

                     View Msvsmon's help for more information.'
Category           : (0)
CategoryNumber     : 0
ReplacementStrings : Msvsmon was unable to start a server named '6D2D071453C5:4020'. The following error occurred: The parameter is incorrect.

                     View Msvsmon's help for more information.
Source             : Visual Studio Remote Debugger
TimeGenerated      : 05.04.2016 9:47:19 AM
TimeWritten        : 05.04.2016 9:47:19 AM
UserName           : NT AUTHORITY\SYSTEM

我注意到一个关于容器主机名的问题,但这可以修复:

6D2D071453C5 是我的 Windows 容器(docker 管理)的容器 ID

PS C:> docker ps -a
CONTAINER ID        IMAGE               COMMAND                   CREATED             STATUS                    PORTS               NAMES
6d2d071453c5        d9d15fbca6d7        "cmd /S /C 'C:\\myprg-"   6 days ago          Up 3 days                                     derrin

通常,在 Docker 中,这个 container id 也将是容器内部/的 hostname

所以,当我运行 docker inspect 6d2d071453c5 时,我会在输出中得到这个:

"Config": 
    "Hostname": "6d2d071453c5",
    "Domainname": "",

然后,在容器内,我在命令行中输入“hostname”并得到:

PS C:> hostname
test2016

这是目前特定于 Windows Server 2016 TP4 / Windows 容器的错误。 主机名不应该是test2016(容器主机的名称,我的实际物理Win2016服务器),而是容器ID(6d2d071453c5)。 至少,这将是我的预期行为,当我在需要 VM 的 Windows 上运行任何其他容器(即 Ubuntu 容器)时也是如此。我刚刚重新检查了它。

不过,为了规避这个问题,我调整了主机文件,添加:

172.16.0.2        6d2d071453c5

现在我至少可以 ping 我自己的主机名了。

PS C:\Program Files\Microsoft Visual Studio 14.0\Common7\IDE\Remote Debugger\x64> ping 6D2D071453C5

Pinging 6d2d071453c5 [172.16.0.2] with 32 bytes of data:
Reply from 172.16.0.2: bytes=32 time<1ms TTL=128
Reply from 172.16.0.2: bytes=32 time<1ms TTL=128

尽管如此,远程调试器仍然没有启动,并且仍然说:

Msvsmon was unable to start a server named "`6D2D071453C5:4020`". 
The following error occurred: The parameter is incorrect.

根据列出所有参数和选项的随附帮助文件,我看不出任何参数有什么问题。相同的命令在容器主机上运行良好,只是不在容器内。

有人让远程调试器在容器内工作吗?

======= 更新 ======

如下所示,我尝试了主机名参数。我不再在事件日志中看到任何错误,但我也没有看到任何东西正在侦听端口 4020。

在 C:\Program Files\Microsoft Visual Studio 14.0\Common7\IDE\Remote Debugger\x64 目录下的容器内执行:

> hostname
WIN-DE6U4068NAF

> ".\msvsmon.exe /nostatus /silent /nosecuritywarn /nofirewallwarn /noclrwarn /port 4020 /hostname WIN-DE6U4068NAF"
.\msvsmon.exe /nostatus /silent /nosecuritywarn /nofirewallwarn /noclrwarn /port 4020 /hostname WIN-DE6U4068NAF

> netstat -ab | find "4020"

>

【问题讨论】:

添加了有关主机名的 docker 问题:github.com/docker/docker/issues/21762 主机名问题似乎是 Server 2016 TP4 中已知的 Windows 容器问题,请参阅 github.com/docker/docker/issues/21762#issuecomment-205904128。但是,我原来的问题仍然存在。 主机名问题在 Server 2016 TP5 中得到解决,但是仍然没有远程调试器来处理它。 我知道它是一篇旧帖子,但我看到你的 docker ps -a 中没有端口...我认为你的调试器找不到带有端口的 docker 容器,因为你没有在你的中设置 EXPOSE 4020 Dockerfile。 【参考方案1】:

要进行调试,您需要将远程工具安装到映像中,正常运行容器,然后使用 docker exec 启动远程调试器。

命令行如下:

docker exec -it &lt;container id/name&gt; "C:\Program Files\Microsoft Visual Studio 14.0\Common7\IDE\Remote Debugger\x64\msvsmon.exe" /nostatus /silent /noauth /anyuser /nosecuritywarn

我在a blog post 中提供了更多详细信息,是的,在本地开发机器上关闭身份验证确实会带来一些风险(无论风险多么小),但这至少应该让您知道如何去做。你可以随时调整命令行选项,让它按照你想要的方式工作。

【讨论】:

【参考方案2】:

我发现这个序列有效:

PS C:\> start-service msvsmon150
PS C:\Program Files\Microsoft Visual Studio 15.0\Common7\IDE\Remote Debugger\x64> .\msvsmon  /noauth /anyuser /silent

在 Windows 10 托管的 Windows 容器中运行时,start-Service 命令会发出一个关于服务无法启动的错误。但是,在输入第二个命令后,端口在 netstat -ab 中显示为被阻止,Visual Studio 2017 可以嗅探调试器单元。

【讨论】:

【参考方案3】:

您是否尝试使用 msvsmon /hostname 选项“硬编码”主机名?

根据 msvsmon 文档: "/hostname hostname_value 指示远程调试器使用指定的主机名值或 IP 地址值侦听网络。在具有多个网卡或分配了多个 DNS 主机名的计算机上,此选项可用于限制其中哪些将允许远程调试。例如,服务器可能有一个面向 Internet 的地址和一个内部地址。通过使用 '/hostname private_ip_address',将无法通过面向 Internet 的地址进行远程调试。"

【讨论】:

【参考方案4】:

好的,在这里扔掉非常明显的东西。 从您的帖子中,命令

".\msvsmon.exe /nostatus /silent /nosecuritywarn /nofirewallwarn /noclrwarn /port 4020 /hostname WIN-DE6U4068NAF"

只会在 powershell 中打印完全相同的字符串。它实际上并没有启动调试器。回声输出显示了这一点。 (我可能读得太多了)

所以/nofirewallwarn 只抑制被防火墙阻止的警告 (YMMV),实际上并没有通过防火墙。你有没有先用/prepcomputer 运行它?

您是否尝试过 /anyuser 绕过身份验证并只允许 TCP 工作?

msvsmon 是否真的绑定到正确的网络接口?有时,绑定到环回适配器意味着它只能在本地访问。当您netstat 时,它是否显示正在侦听所有接口 (0.0.0.0)?

您是否尝试过使用/service 选项将其作为服务运行? 不过,可能还有更多的陷阱。我通常很难让它在现场工作。

【讨论】:

感谢您的回答。我没有再启动和运行这个环境,所以我现在不能再测试它了。与此同时,该项目已过时。我想我也没有冒号" 运行它,但不确定,因为这就是我在主机上运行它以在那里测试它的方式(参见我的第一个命令行)。您是否让调试器在您身边的容器内运行?既然你提到“我通常很难让它在现场工作。” 我试图让它在 Windows Server 中通过 *** (TAP) 无外设工作,这些是我会尝试的一些事情。 抱歉,马蒂亚斯。我刚刚注意到原始发布的日期。 没问题。顺便说一句:我认为 Windows Container 和 Windows Server headless 仍然是不同的东西,并且有不同的问题/行为。不过不确定。我发现并报告了几个特定于容器而不是特定于 Windows 的问题(与本文无关)。如果我再次设置容器,我会试试你的想法。如果在这篇文章中打开赏金的@Sedate Alien 可以确认这是一个解决方案,请告诉我。 如果您和Sir Alien 无法完成这项工作,并且由于您确实具有shell 访问权限,我是否建议您使用cordbg?假设你有你的符号文件,你可以(稍微悲惨地)设置断点并获得控制台输出。

以上是关于在 Windows 容器中运行 Visual Studio 远程调试器(由 Docker 管理)的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在Windows容器中安装Visual Studio

Microsoft Visual Basic - 运行时错误“3075:查询表达式“1st”、“A”、1-Jan-15'、“1”中的语法错误(缺少运算符))

如何从 Visual Studio 调试在 Linux Docker 容器中运行的 .NET Core 应用程序

OF框架在Visual Studio中启用Docker支持,编译生成,并在容器运行项目

如何使用 Visual Studio 2019 在 Docker 容器中运行 ASP.NET Core 3.1 项目?

使用 Visual Studio 2017 调试已运行的 Docker Linux .NET Core 容器