Depurando servicios de Windows más facilmente
Depurar servicios es una tarea complicada. Esta complejidad tiene su origen en dos aspectos, uno, que es el SCM quien inicia un servicio y por tanto no podemos iniciar los servicios con el depurador adjuntado al proceso (al menos no facilmente) y dos para cuando tenemos oportunidad de adjuntar el depurador, el código de inicio del servicio ya ha ejecutado.
Os voy a contar un par de trucos que uso a la hora de depurarlos.
El primero es bien simple, se trata de usar la siguiente instrucción:
System.Diagnostics.Debugger.Launch();
Esta instrucción hará que salte el típico cuadro de diálogo que nos permite seleccionar el depurador que queremos adjunta a nuestro servicio. Evidentemente la podemos usar en aplicaciones que no sean servicios para tener la oportunidad de ajuntar un depurador cuando se ejecute determinado código.
Esta línea puesta como primera línea del método Main de nuestro servicio nos permitirá contar con el depurador adjuntado desde el primer momento y depurar así el inicio del servicio. Es importante poner está línea entre compilación condicional para evitar que se nos cuele la instrucción que activa el depurador en una construcción de 'release'...
static void Main()
{
#if DEBUG_SERVICE_START
System.Diagnostics.Debugger.Launch();
#endif
...
}
El segundo truquito es hacer que nuestro servicio se comporte como una aplicación de consola en unas ocasiones y como un servicio en otras.
static void Main()
{
#if DEBUG
Service1 svc = new Service1();
svc.OnStart(null);
//Es necesario domir este hilo para que la aplicación
//no termine y nos permita depurar
System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite);
#else
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[] { new Service1() };
ServiceBase.Run(ServicesToRun);
#endif
}
Espero que estos dos truquitos os faciliten la vida a la hora de depurar vuestros servicios...