Запуск удаленного отладчика Visual Studio в контейнере Windows (поддерживается Docker)

Я пытаюсь запустить удаленный отладчик Visual Studio в Контейнере Windows на Windows Server 2016 TP4. Поскольку он работает внутри контейнера, пользовательский интерфейс отсутствует.

Я пытаюсь запустить удаленный отладчик с помощью:

 .\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 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 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 - это id контейнера моего контейнера Windows (управление докере):

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 этот идентификатор контейнера также будет содержать имя хоста внутри/контейнера.

Итак, когда я запускаю docker inspect 6d2d071453c5, я получаю это на выходе:

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

Но затем внутри контейнера введите "hostname" в командной строке и получите:

PS C:> hostname
test2016

Это ошибка, характерная для Windows Server 2016 TP4/Windows Containers на данный момент. Имя хоста не должно быть test2016 (имя хоста контейнера, мой фактический физический сервер Win2016), но идентификатор контейнера (6D2D071453C5). По крайней мере, это будет мое ожидаемое поведение, и это также происходит, когда я запускаю любой другой контейнер, то есть контейнер Ubuntu, в Windows, для которого требуется виртуальная машина. Я только что проверил его.

Тем не менее, чтобы обойти проблему, я настраиваю файл хоста, добавляя:

172.16.0.2        6d2d071453c5

Теперь я могу по-прежнему пинговать свое собственное имя хоста.

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\Удаленный отладчик \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"

>

Ответы

Ответ 1

Вы пытались "жестко закодировать" имя хоста, используя параметр msvsmon/hostname?

Согласно документации msvsmon: "/hostname hostname_value Устанавливает удаленный отладчик для прослушивания в сети с использованием указанного значения имени хоста или значения IP-адреса. На компьютере с несколькими сетевыми картами или с несколькими назначенными именами DNS-хоста этот параметр можно использовать для ограничения того, какой из этих позволяет удаленно отлаживать.Например, у сервера может быть адрес, обращенный к Интернету, и внутренний адрес. Используя" /hostname private_ip_address", удаленная отладка не будет доступна через адрес, обращенный к Интернету.

Ответ 2

Хорошо, выбросив действительно очевидное здесь. С вашего поста команда

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

будет просто печатать ту же самую строку в powershell. На самом деле он не запускает отладчик. Эхо-выход показывает это. (Возможно, я слишком много читаю)

Итак, /nofirewallwarn только блокирует блокировку по предупреждению брандмауэра (YMMV) и фактически не проходит через брандмауэр. Вы сначала запустили его с помощью /prepcomputer?

Пробовали ли вы /anyuser обходить auth и разрешать работать только TCP?

Действительно ли msvsmon привязан к правильному сетевому интерфейсу? Иногда привязка к петлевому адаптеру означает, что он может быть доступен только локально. Когда вы netstat показывает, что он прослушивает все интерфейсы (0.0.0.0)?

Вы пытались запустить его как услугу с опцией /service? Однако может быть еще несколько ошибок. Мне обычно приходилось тяжело работать в поле.

Ответ 3

Для отладки вам необходимо установить удаленные инструменты в образ, запустить контейнер в соответствии с нормальным, а затем запустить удаленный отладчик с помощью 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 на вашей локальной машине-разработчике действительно несет некоторый риск ( как бы ни мала), но это должно по крайней мере дать вам представление о том, как это сделать. Вы всегда можете настроить параметры командной строки, чтобы заставить его работать так, как вы хотите.

Ответ 4

Я нашел, что эта последовательность работает:

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, размещенном в Windows 10. Однако после ввода второй команды порты отображаются как заблокированные в netstat -ab, а Visual Studio 2017 может обнюхать блок отладчика.