4 votes

Déboguer un service Windows

Je suis en train de créer un service Windows et je veux le déboguer.

Voici l'erreur que j'obtiens lorsque j'essaie de la déboguer :

Impossible de démarrer le service à partir de la ligne de commande ou d'un débogueur. Un service Windows doit d'abord être installé, puis démarré à l'aide de l'Explorateur de serveur, de la TOll d'administration des services Windows ou de la commande de démarrage NET.

J'ai déjà installé mon service en utilisant InstallUtil mais je rencontre toujours des problèmes.

De plus, lorsque j'essaie d'attacher un processus, mon service passe en mode d'exécution, il ne commence jamais à déboguer.

EDIT : Doit-on réinstaller le service Windows à chaque fois que l'on fait un changement ou est-ce que la construction du service suffit ?

0voto

BRaul Points 226

Une façon de procéder que j'ai utilisée auparavant était d'insérer un Debugger.Break() dans la méthode de démarrage du service. Compilez et installez le service. Lorsqu'il démarre, il s'interrompt et ouvre le dialogue de débogage avec, à partir de là, vous devriez être en mesure d'attacher et de déboguer.

0voto

WraithNath Points 7244

La méthode Debugger.Launch est un bon moyen, mais je préfère créer une classe qui fait le traitement et l'appeler depuis le service, ce qui peut aussi être appelé depuis une application win forms. Par exemple :

class ProcessingManager
{

    public void Start()
    {
     //do processing
    }

    public void Stop()
    {
    //stop
    }
}

ensuite, dans votre service / application win forms, créez simplement une instance de la classe de traitement comme variable membre et appelez la méthode au démarrage et à l'arrêt. Cela peut être utilisé dans le service, ou dans une application win forms avec un bouton de démarrage et d'arrêt, ce que je trouve beaucoup plus rapide que d'attacher le débogueur à chaque fois parce que vous pouvez configurer l'application Windows pour qu'elle démarre par défaut et ajouter des points d'arrêt dans le gestionnaire de traitement.

extrait du code de service :

namespace Service
{
    public partial class Service : ServiceBase
    {
        #region Members

        private ProcessingManager m_ProcessingManager = null;

        #endregion Members

        #region Constructor

        /// <summary>
        /// Constructor
        /// </summary>
        public Service()
        {
            InitializeComponent();

            try
            {
                //Instantiate the processing manager
                m_ProcessingManager = new ProcessingManager();
            }
            catch (Exception ex)
            {
                ErrorHandler.LogError(ex);
            }
        }

        #endregion Constructor

        #region Events

        /// <summary>
        /// Starts the processing
        /// </summary>
        /// <param name="args">Parameters</param>
        protected override void OnStart(string[] args)
        {
            try
            {
                //Start the Processing
                m_ProcessingManager.Start();
            }
            catch (Exception ex)
            {
                ErrorHandler.LogError(ex);
            }
        }

        /// <summary>
        /// Service Stopped
        /// </summary>
        protected override void OnStop()
        {
            try
            {
                //Stop Processing
                m_ProcessingManager.Stop();
            }
            catch (Exception ex)
            {
                ErrorHandler.LogError(ex);
            }
        }

        #endregion Events
    }
}

0voto

Naila Akbar Points 46

Pour déboguer ou tester votre service sans l'installer, apportez des modifications dans Program.cs comme ceci.

static class Program
{
    static void Main()
    {
        ServiceBase[] ServicesToRun;
        ServicesToRun = new ServiceBase[] 
    { 
      new MyService() 
    };
        ServiceBase.Run(ServicesToRun);
    }
   }

Changez-le en :

static class Program
{
static void Main()
{
    #if(!DEBUG)
       ServiceBase[] ServicesToRun;
       ServicesToRun = new ServiceBase[] 
   { 
        new MyService() 
   };
       ServiceBase.Run(ServicesToRun);
     #else
       MyService myServ = new MyService();
       myServ.Process();
       // here Process is my Service function
       // that will run when my service onstart is call
       // you need to call your own method or function name here instead of Process();
     #endif
    }
}

-1voto

jaywayco Points 1506

Ce que je fais toujours, c'est mettre un :

#if DEBUG 

 Thread.Sleep(20000) 

#endif

dans le OnStart . Cela me donne 20s à attacher.

Rapide et facile, pensez juste à l'emballer dans un sac à dos. #if DEBUG #endif :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X