visual studio depurar debuggear debug como debugging docker containers remote-debugging windows-server-2016

debugging - depurar - Ejecución del depurador remoto de Visual Studio en el contenedor de Windows(gestionado por Docker)



como depurar en visual studio 2017 (4)

Intento ejecutar el depurador remoto de Visual Studio en un contenedor de Windows en Windows Server 2016 TP4 . Como se ejecuta dentro de un contenedor, no hay una interfaz de usuario.

Intento ejecutar el depurador remoto a través de:

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

Estoy ejecutando lo anterior como usuario administrador (nt authority / system). Esto funciona bien en la computadora host, pero no funciona dentro del contenedor. El registro de eventos de Windows muestra el siguiente evento de error.

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

Registro de eventos completo:

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

Noté un problema relacionado con el nombre de host del contenedor, pero esto se puede solucionar:

6D2D071453C5 es el ID de contenedor de mi contenedor de Windows (administrado por docker):

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

Generalmente, en Docker, esta identificación del contenedor también será el nombre de host dentro del contenedor.

Entonces, cuando ejecuto la docker inspect 6d2d071453c5 , obtengo esto en la salida:

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

Pero luego, dentro del contenedor, hostname " hostname " en la línea de comandos y obtengo:

PS C:> hostname test2016

Este es un error específico de Windows Server 2016 TP4 / Windows Containers en este momento. El nombre de host no debe ser test2016 (el nombre del host contenedor, mi servidor físico Win2016 real) sino la identificación del contenedor ( 6d2d071453c5 ). Al menos, este sería mi comportamiento esperado y también es el caso cuando ejecuto cualquier otro contenedor, es decir, un contenedor de Ubuntu, en Windows que requiera una VM. Acabo de volver a comprobarlo.

Sin embargo, para evitar el problema, ajusto el archivo host, agregando:

172.16.0.2 6d2d071453c5

Ahora puedo hacer ping a mi propio nombre de host al menos.

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

Sin embargo, el depurador remoto aún no se inicia, y aún dice:

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

No veo qué está mal con ninguno de los parámetros, de acuerdo con el archivo de ayuda adjunto que enumera todos los parámetros y opciones. El mismo comando funciona bien en el host del contenedor, pero no dentro del contenedor.

¿Alguien ha conseguido que el depurador remoto funcione dentro de un contenedor?

======= Actualización ======

Como se sugiere a continuación, probé el parámetro de nombre de host. Ya no veo ningún error en el registro de eventos, pero tampoco veo que haya nada escuchando en el puerto 4020.

Ejecutado dentro del contenedor en el directorio C: / Archivos de programa / 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" >


¿Intentó "codificar" el nombre de host con la opción msvsmon / hostname?

De acuerdo con la documentación de msvsmon: "/ hostname hostname_value Indica al depurador remoto que escuche en la red utilizando el valor del nombre de host especificado o el valor de la dirección IP. En una computadora con varias tarjetas de red o con múltiples nombres de host DNS asignados, esta opción puede ser utilizado para restringir cuál de estos permitirá la depuración remota. Por ejemplo, un servidor puede tener una dirección de Internet y una dirección interna. Al usar ''/ hostname private_ip_address'', la depuración remota no estará disponible a través de la dirección de Internet ".


Encontré esta secuencia para trabajar:

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

El comando de inicio del servicio lanzará un error acerca de cómo el servicio no puede iniciarse cuando se ejecuta en un contenedor de Windows 10 alojado en Windows. Sin embargo, después de ingresar el segundo comando, los puertos aparecen como bloqueados en netstat -ab y Visual Studio 2017 puede detectar la unidad de depuración.


Está bien, tirar lo realmente obvio aquí. Desde tu post, el comando.

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

simplemente imprimirá esa misma cadena exacta en powershell. En realidad no inicia el depurador. La salida de eco muestra esto. (Podría estar leyendo demasiado en esto)

Así que /nofirewallwarn solo suprime el bloqueo por advertencia de firewall (YMMV), y en realidad no pasa a través del firewall. ¿Lo has ejecutado con /prepcomputer primero?

¿Ha intentado /anyuser omitir auth y permitir que solo TCP funcione?

¿Está msvsmon realmente vinculado a la interfaz de red correcta? A veces, estar vinculado al adaptador de bucle invertido significa que solo puede ser accesible localmente. ¿Cuándo muestra netstat que escucha en todas las interfaces ( 0.0.0.0 )?

¿Ha intentado ejecutarlo como un servicio con la opción /service ? Sin embargo, podría haber más errores. Por lo general, me cuesta trabajo hacer que funcione en el campo.


Para realizar la depuración, deberá instalar las herramientas remotas en la imagen, ejecutar el contenedor de forma normal y luego iniciar el depurador remoto con la herramienta docker exec .

La línea de comando es la siguiente:

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

Tengo más detalles en una publicación de blog , y sí, desactivar la autenticación en su máquina de desarrollo local conlleva cierto riesgo (sin importar lo pequeño que sea), pero al menos esto debería darle una idea de cómo hacerlo. Siempre puedes modificar las opciones de la línea de comandos para que funcione como tú quieras.