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.

image

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…

5 comentarios en “Depurando servicios de Windows más facilmente”

  1. Me gusta poco el .NET (o al menos la implementación que MS ha hecho de sus mismas espeficicaciones)… pero a veces tiene cosas que, sin ser nuevas, son simplemente maravillosas.

    Y digo sin ser nuevas porque Clipper traía eso con dos colores: o abrir el depurador directamente, o abrirlo pulsando, si no recuerdo mal, Ctrl-D. Y no he vuelto a verlo desde entonces.

  2. Lo que yo hago para depurar es que en vez de crear un proyecto tipo Windows Service creo uno tipo Console Application, por argumentos de línea de comandos le digo que corra como aplicación de consola o como servicio, dependiendo si lo estoy depurando o ya está en ejecución como servicio.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *