martes, 14 de mayo de 2013

Depuración remota avanzada con Visual Studio y Sharepoint

Objetivo:
Realizar una depuración paso a paso usando Visual Studio 2010 de un componente (WebPart,Httpmodule,TimerJob,Feature,WebService,etc..) desplegado en un servidor remoto.

Introducción:
En ocasiones es "imposible" reproducir un entorno completamente real en una maquina local destinada para desarrollo, seguramente a muchos de nosotros nos pasa que al desplegar una solución probada hasta la saciedad, comienza a dar errores en el entorno destino, los cuales no somos capaces de reproducir.
Una solución es guardar trazas, en Ficheros de Log, EventViewer, etc..  Resulta muy buena práctica el uso de trazas, pero no es tan rápido como adjuntarnos a un proceso y depurar cualquier error que se produzca, sea cual sea ,activando  la captura de todo tipo de excepciones lanzadas (ver imágenes).
Esto último resulta extremadamente útil cuando no sabes por donde fallan las cosas.
Es harina de otro costal el poner un punto de interrupción y depurar desde nuestro visual Studio en un servidor remoto, y es precisamente lo que quiero explicar en este post, paso a paso.

Ingredientes necesarios en la máquina de desarrollo (Cliente):
1)      Visual Studio 2010 con nuestro proyecto en cuestión abierto y con los puntos de interrupción colocados.
2)      Compilar en Modo Debug y desplegar en el servidor.
3)      En la carpeta de compilación localizamos el fichero .PDB que genera Visual Studio en la carpeta /debug del proyecto, los usaremos más adelante.
4)      Abrir el firewall de Windows para todas las conexiones entrantes al PROGRAMA Remote Debugger (msvmom.exe) tanto para TCP como para UDP
http://msdn.microsoft.com/es-es/library/vstudio/bb385831(v=vs.100).aspx

Ingredientes necesarios  en el Servidor:
1)      Microsoft Visual Studio 2010 Remote Debugger (Instalado en el servidor)
http://www.microsoft.com/en-us/download/details.aspx?id=475
2)      Abrir el firewall de Windows para todas las conexiones entrantes al PROGRAMA Remote Debugger (msvmom.exe) tanto para TCP como para UDP a veces sale este mensaje.
http://msdn.microsoft.com/es-es/library/vstudio/bb385831(v=vs.100).aspx
3)      Desplegar el proyecto compilado en modo Debug en visual Studio.
4)      Si nuestro proyecto despliega a la carpeta /BIN de IIS todo es mas fácil  solo hay que copiar el fichero .PDB del punto 3 en la misma carpeta que la DLL que hemos generado en el cliente.
a.       Si el proyecto despliega a la GAC hay que abrirla en modo "Carpeta" para asi poder copiar el .PDB, esta opción se activa añadiendo la propiedad DWORD, disablecacheviewer con valor 1 en esta ruta del Registro del windows en el servidor : HKLM\Software\Microsoft\Fusion

La GAC vista como carpetas:
5)      Arrancar el Remote Debugger en el servidor
Nota:  tiene que coincidir la version y la arquitectura de procesador del cliente y servidor Cliente_x86==Servidor_x86  Cliente_x64==Servidor_x64
estan ubicados en la ruta C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\Remote Debugger\  en la carpeta x64   o x86
6)      Dar permisos al usuario del cliente que quiere depurar, en la opción de permisos (esto no se guarda hay que hacerlo siempre que se reinicie el remote debugger) hay que darle a Aceptar cuando nos pregunta si queremos realmente depurar.


7)      En el Remote debugger Abrimos las Opciones y copiamos el nombre del servidor (lo necesitaremos),  es del tipo "mi_dominio\mi_usuario@nombre_servidor" también podemos Activar la opción de "Sin autenticación (solo nativo)" marcando "permitir que cualquier usuario depure", esto a veces es mas sencillo (e inseguro).

8)      Abrir IIS , y el apartado de WorkerProcesses para obtener el numero de PID del proceso a depurar, lo necesitaremos en el ultimo paso.


Si ya hemos realizado los pasos preparatorios, ahora podemos hacer …

DEPURACIÓN REMOTA
1º Desde el cliente, en el Visual Studio seleccionamos: Debug>AttachToProcess

2º En la ventana de Attach to process en el recuadro de Qualifier, escribimos el Servidor en cuestión que copiamos de las opciones del remote debugger en el servidor.
3º Se cargan todos los procesos, seleccionamos el w3wp.exe que tiene el PID que apuntamos en el Punto 8 de workerprocess.
4º Pulsamos  ATTACH y …. Voila, ya estamos depurando, ahora solo lanzar la parte que queréis depurar vía navegación y saltara el punto de interrupción.

Notas: No olvidéis copiar el .PDB en cada nueva compilación  el PID del workerprocess cambia con cada Reciclado de application Pool y con cada IIS Reset.

Truco:
Si creáis una Aplicación web Extendida de Sharepoint, en otro puerto con otro AplicationPool, no paráis todo el entorno, esto es muy útil para un equipo de desarrollo que anda depurando continuamente.

Espero que os resulte de utilidad,  y muchas gracias a Luis Lázaro por instruirme en estas difíciles artes.


1 comentario:

  1. Hola, me parece bastante interesante el post y hoy tengo un problema de este tipo, mi pregunta es .. Lo podre depurar la app del server corriendo la aplicacion de mi carpeta remota donde se encuentra el proyecto que esta corriendo en el servidor ??..

    Gracias.

    ResponderEliminar