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

时间:2016-04-05 07:56:57

标签: debugging docker containers remote-debugging windows-server-2016

我尝试在 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容器的容器ID (docker managed):

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中,此容器ID 也将是容器内/的主机名

所以,当我运行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.

根据列出所有参数和选项的随附帮助文件,我不知道任何参数有什么问题。同样的命令在容器主机上工作正常,而不是在容器内。

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

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

如下所示,我尝试了hostname参数。我不再在事件日志中看到任何错误,但我也没有看到任何内容正在侦听端口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"

>

4 个答案:

答案 0 :(得分:1)

您是否尝试过&#34;硬编码&#34;使用msvsmon / hostname选项的主机名?

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

答案 1 :(得分:1)

好的,扔掉这里真的很明显。 从你的帖子,命令

  

“。\ 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选项将其作为服务运行? 不过可能会有更多陷阱。我通常很难让它在现场工作。

答案 2 :(得分:1)

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

命令行如下:

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

我在a blog post中有更多详细信息,是的,关闭本地开发机器上的auth确实带来了一些风险(无论多小)但这至少应该让你知道怎么做它。您可以随时调整命令行选项,使其按您希望的方式工作。

答案 3 :(得分:0)

我发现这个序列有效:

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

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