jueves, 12 de enero de 2012

IIS Remote Debugging / Visual Studio 2010

Existen ciertas diferencias al ejecutar una aplicación web en el equipo donde se ha desarrollado el código de la misma respecto al equipo donde se va a publicar.

Tales diferencias incluyen:

- Versión del sistema operativo
- Dependencias de aplicaciones (directorios creados, archivos de configuración, librerías de vínculos dinámicos, etc)
- Versión del Framework instalado
- Servidor que ejecuta la aplicacion (ASP.NET Development Server vs IIS, Ver artículo relacionado)

Por esa razón es común que existan fallos en ambientes de producción que no pueden ser detectados en ambientes de desarrollo.

Una herramienta muy util para encontrar (y resolver) este tipo de problemas es la aplicación de Depuración Remota incluída en Visual Studio "msvsmon.exe".

Hace poco tuve un problema de este tipo y estuve investigando sobre cómo conectar el Debugger con un servidor remoto, encontré diversos videos y tutoriales en Internet que describen el proceso pero ninguno describía la depuración remota en un servidor IIS, instalado en un equipo diferente al de desarrollo, por tal razón pensé en escribir un listado de pasos para facilitarle la vida a cualquiera que tenga la misma situación.


Depuración Remota en un servidor IIS



1. Compilar el código fuente en un directorio accesible desde el servidor



Al compilar una aplicación ASP.NET, se generan unos archivos con extensión PDB (Program Database) en el directorio bin, dichos archivos contienen información utilizada para la depuración de esa aplicación. Al depurar un equipo remoto, dichos archivos deben ser generados en una ubicación accesible al servidor donde está instalada la aplicación.

Para este propósito, se debe compartir la carpeta de código fuente con permisos de lectura y escritura a un usuario que tenga acceso al servidor.


  • Clic derecho sobre la carpeta

  • Elegir Propiedades

  • Ir a la pestaña Compartir

  • Escribir el nombre del usuario y hacer clic en agregar

  • Seleccionar los permisos Lectura y Escritura

  • Clic en Compartir

  • Clic en Listo





El siguiente paso es muy importante, se debe abrir el proyecto en VS utilizando la Ruta de acceso de red de la carpeta compartida, la cual puede consultarse en las propiedades de la carpeta:



Los pasos son:


  • Ejecutar VS2010 como administrador (clic derecho, Ejecutar como administrador; esto servirá posteriormente para la depuración remota)

  • Ir a Archivo / Abrir / Proyecto o Solución

  • Pegar la Ruta de acceso de red en el nombre del archivo y presionar la tecla Enter

  • Elegir el archivo de proyecto y hacer clic en Abrir






El proyecto debería compilar sin problemas. Posteriormente, se debe publicar la aplicación al servidor web donde se desea depurar (para que coloque allí los PDBs que hacen referencia al código fuente de la carpeta compartida).

Para tal propósito, hacer clic derecho sobre el proyecto (en el Explorador de soluciones) y realizar la publicación. Artículo relacionado



2. Levantar MSVMON.EXE en el servidor remoto




msvmon.exe es el ejecutable que levanta el Servicio de Depuración Remota en el servidor que deseamos analizar. Se instala por defecto con Visual Studio 2010 y no es necesario realizar ninguna instalación en el servidor, basta con copiar la carpeta que contiene dicho ejecutable al servidor.

Este ejecutable se puede encontrar en %ProgramFiles%\Microsoft Visual Studio 10.0\Common7\IDE\Remote Debugger en dos versiones, una para equipos de 32 bits (x86) y otra para equipos de 64 (x64), de acuerdo al procesador del servidor, se debe copiar la carpeta adecuada a dicho servidor.

Una vez trasladada la aplicación msvmon.exe se debe iniciar sesión en el servidor con el usuario al que se dieron permisos de Lectura y Escritura a la carpeta compartida y ejecutar msvmon.exe.

Se mostrará el mensaje Msvmon started a new server named ... Waiting for connections.

Se debe hacer clic en Tools / Options y copiar el Server Name, que nos servirá para Atachar el proceso (IIS Worker Process) a VS2010.

También debemos conocer el Process ID de la aplicación que queremos depurar, ya que IIS crea un proceso (IIS WP) para cada Pool de Aplicación que exista, para tal propósito, se puede ejecutar el siguiente comando en la línea de comandos:

cscript c:\windows\system32\iisapp.vbs



Si no aparece el PID del application pool deseado, se debe ir a un browser y ejecutar la aplicación web que se requiere depurar, para que inicie la instancia de w3wp, posteriormente, ejecutar de nuevo el comando indicado.

Una vez que tenemos estos datos (w3wp.exe PID del application pool deseado y el Server Name), volvemos al equipo de desarrollo.



3. Atachar el proceso w3wp a Visual Studio y realizar la depuración



Volvemos a VS2010 y realizamos los siguientes pasos:


  • Ir al menú Herramientas / Asociar al proceso

  • En la caja de texto de Calificador, pegar el Server Name que habíamos copiado desde el servidor remoto y hacer clic en el botón Actualizar. Si se tiene activado el Firewall, se debe agregar la excepción correspondiente cuando pregunte, o bien agregar Visual Studio 2010 al listado de excepciones de aplicación del firewall

  • Del listado de procesos, se debe localizar el w3wp.exe que corresponda al PID del pool de aplicaciones deseado.



  • Una vez seleccionado el proceso, hacer clic en Asociar

  • Ir a la líea de código que se desea depurar y colocar un Break Point



  • Por último, ejecutar la aplicación desde el browser. El break point debería detener su ejecución al alcanzar la línea marcada.



Saludos.

2 comentarios: