我尝试在Windows Server 2016 TP4上的Windows容器中运行Visual Studio远程调试器。因为它在容器中运行,所以没有UI
我尝试通过以下方式运行远程调试器:
\msvsmon.exe/nostatus/silent/nosecuritywarn/nofirewallwarn/noclrwarn/port 4020
我以管理员用户(nt authority\system)的身份执行上述操作。
这在主机上可以正常工作,但在容器中不起作用。Windows事件日志显示以下错误事件
Msvsmon无法启动名为“`6D2D071453C5:4020`”的服务器。
发生以下错误:参数不正确。
完整的事件日志:
获取事件日志-日志名应用程序-EntryType错误|格式列表
索引:1718
EntryType:错误
实例ID:3221226473
消息:找不到源“Visual Studio远程调试器”中事件ID“-1073740823”的说明。本地计算机可能没有必要的注册表信息或消息DLL
文件以显示消息,或者您可能没有访问这些文件的权限。以下信息是事件的一部分:’Msvsmon无法启动名为的服务器
“6D2D071453C5:4020”。发生以下错误:参数不正确。
有关详细信息,请查看Msvsmon的帮助。”
类别:(0)
类别编号:0
ReplacementString:{Msvsmon无法启动名为“6D2D071453C5:4020”的服务器。发生以下错误:参数不正确。
有关详细信息,请查看Msvsmon的帮助。}
来源:Visual Studio远程调试器
生成时间:2016年4月5日上午9:47:19
时间:2016年4月5日上午9:47:19
用户名:NT AUTHORITY\SYSTEM
我注意到关于容器主机名的一个问题,但这是可以解决的:
6D2D071453C5是我的Windows容器(docker管理)的容器id:
psc:>;docker ps-a
容器ID映像命令已创建状态端口名称
6d2d071453c5 d9d15fbca6d7“cmd/S/C'C:\\myprg-”6天前起3天除草
通常,在Docker中,此容器id也将是容器内部/的主机名
因此,当我运行docker inspect 6d2d071453c5时,我在输出中得到以下信息:
“配置”:{
“主机名”:“6d2d071453c5”,
“域名”:“,
但是,在容器内部,我在命令行中键入“hostname”,并获得:
PS C:>;主机名
2016年测试
这是目前Windows Server 2016 TP4/Windows容器特有的一个bug。
主机名不应该是test2016(容器主机的名称,我的实际物理Win2016服务器),而应该是容器id(6d2d071453c5)。
至少,这是我的预期行为,当我在需要虚拟机的Windows上运行任何其他容器(例如Ubuntu容器)时也是如此。我只是重新检查了它
然而,为了避免这个问题,我调整了主机文件,添加了:
172.16.0.2 6d2d071453c5
现在我至少可以ping我自己的主机名了
PS C:\Program Files\Microsoft Visual Studio 14.0\Common7\IDE\Remote Debugger\x64>;ping 6D2D071453C5
使用32字节数据ping 6d2d071453c5[172.16.0.2]:
172.16.0.2的回复:字节=32次<;1ms TTL=128
172.16.0.2的回复:字节=32次<;1ms TTL=128
尽管如此,远程调试器仍然不会启动,并且仍然显示:
Msvsmon无法启动名为“`6D2D071453C5:4020`”的服务器。
发生以下错误:参数不正确。
根据列出所有参数和选项的附带帮助文件,我看不出任何参数有什么问题。同样的命令在容器主机上运行良好,只是不在容器内
有人让远程调试器在容器中工作吗
=======更新======
正如下面所建议的,我尝试了hostname参数。我在事件日志中再也看不到任何错误,但我也看不到端口4020上有任何内容正在侦听
在目录C:\Program Files\Microsoft Visual Studio 14.0\Common7\IDE\Remote Debugger\x64中的容器内执行:
主机名
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 |查找“4020”
&燃气轮机;
要进行调试,您需要将远程工具安装到映像中,按照常规运行容器,然后使用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
我在一篇博客文章中得到了更多的细节,是的,在本地开发机器上关闭auth确实会带来一些风险(不管风险有多小),但这至少会让你知道如何去做。你可以随时调整命令行选项,让它以你想要的方式工作