martes, 8 de julio de 2008

Depurando servicios de Windows del modo fácil

¿Cómo puedo "atachar" facilmente un servicio de windows para depurarlo?

La forma clásica es tener el servicio corriendo y presionando Ctrl + Alt + P buscar el proceso en la ventanita y asociarlo con el código, esto es especialemente molesto en caso de neceistar que el servicio no haga nada antes de encontrarse "atachado" y sobre todo para encontrar un buen lugar donde poner el punto de interrupción, bien , hay una forma más sencilla.

System.Diagnostic. Debugger un amigo

Dentro de las muchas clases que hay dentro de este espacio de nombre se encuentra la buena de Debugger, si somos un poco avispados nos podemos dar cuenta de su fución: es para depurar, dentro de sus métodos hay uno que nos va a ayudar en este caso, Launch(), este método va a lanzar el "debugger" de .net inmediatamente, fantástico, ahora el tema es cómo hacer para lanzarlo en el servicio y no siempre, bueno, veamos.

¿Cómo leer los parámetros de línea de comando de un servicio de Windows?

Fácil, dentro del método Start del servicio llegan los parámetros, o sea, lo único que deberíamos hacer es leer un parámetro que lo podemos llamar "DEBUG" para ser astudos y en caso de llegar llamar a Debugger.Lanuch() y listo, vamos a ver cómo

namespace MiServicioLoco
{
    public partial class ServicioLoco : ServiceBase
    {
        public ServicioLoco()
        {
            InitializeComponent();
        }

        /// <summary>
        /// Este método se ejecuta cuando se inicia el servicio
        /// </summary>
        /// <param name="args"></param>
        protected override void OnStart(string[] args)
        {
            //los parámetros que se envían desde la ventana de propiedades del servicio
            //entren por acá

            //en caso de que el primer parámetro de línea de comando sea igual a DEBUG
            //se lanza el debugger
            if (args.GetLength(0) > 0 && args[0].Equals("DEBUG"))
                System.Diagnostics.Debugger.Launch();
                
            //ahora podemos continuar con el proceso atachado

        }

        protected override void OnStop()
        {
            // TODO: Add code here to perform any tear-down necessary to stop your service.
        }
    }
}

Grandioso, ahora lo único que debemos hacer es


para pasar el parámetro al serivico y mágicamente se lanzará la ventana


Mágico, seleccionamos el debugger (el VS) y listo, que mejore vuestra depuración....saludos.