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...

Published 8/3/2008 23:36 por Rodrigo Corral
Archivado en: ,

Comentarios

# re: Depurando servicios de Windows más facilmente

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.

Sunday, March 09, 2008 11:54 AM by Rafael Ontivero

# re: Depurando servicios de Windows más facilmente

Que bueno lo del Debugger.Launch Rodrigo, me acabas de hacer un mundo :D

Sunday, March 09, 2008 4:32 PM by Valeriano Tórtola

# Tip: ¿Cómo depurar Windows Services?

Muy seguramente si has construido una aplicación de tipo Windows Service (Servicio de Windows),

Monday, March 10, 2008 8:46 PM by Guillermo G. Blog

# re: Depurando servicios de Windows más facilmente

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.

Saturday, July 26, 2008 12:05 AM by Edward

# re: Depurando servicios de Windows más facilmente

Hola,

Gracias por el post. En esta misma línea, de hacer debug de servicios, he encontrado un enlace también muy útil:

theimes.com/.../Debugging-Windows-Services-is-a-Pain.aspx

Wednesday, January 14, 2009 7:04 PM by VictorVelarde

Deja tu comentario

(requerido) 
(requerido) 
(opcional)
(requerido)