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 ?

4voto

Mrchief Points 25418

Dans votre OnStart utilisez quelque chose comme ça :

#if DEBUG
if(!System.Diagnostics.Debugger.IsAttached)
   System.Diagnostics.Debugger.Launch();
#endif

4voto

Lucero Points 38928

Pour la plupart des cas d'utilisation, il est suffisant d'exécuter le service en tant qu'application console. Pour ce faire, j'ai généralement le code de démarrage suivant :

private static void Main(string[] args) {
    if (Environment.UserInteractive) {
        Console.WriteLine("My Service");
        Console.WriteLine();
        switch (args.FirstOrDefault()) {
        case "/install":
            ManagedInstallerClass.InstallHelper(new[] {Assembly.GetExecutingAssembly().Location});
            break;
        case "/uninstall":
            ManagedInstallerClass.InstallHelper(new[] {"/u", Assembly.GetExecutingAssembly().Location});
            break;
        case "/interactive":
            using (MyService service = new MyService(new ConsoleLogger())) {
                service.Start(args.Skip(1));
                Console.ReadLine();
                service.Stop();
            }
            break;
        default:
            Console.WriteLine("Supported arguments:");
            Console.WriteLine(" /install      Install the service");
            Console.WriteLine(" /uninstall    Uninstall the service");
            Console.WriteLine(" /interactive  Run the service interactively (on the console)");
            break;
        }
    } else {
        ServiceBase.Run(new MyService());
    }
}

Cela permet non seulement d'exécuter et de déboguer facilement le service, mais aussi de l'installer et de le désinstaller sans avoir besoin du programme InstallUtil.

4voto

Bryan Crosby Points 4546

Cette question a une excellente réponse en faisant du service un hybride console/service. Voir le réponse de l'utilisateur marc_s . Je ne veux pas répéter la réponse ici.

2voto

Tigran Points 41381

Personnellement, pour moi, j'ai trouvé que la solution la plus simple est de ne pas modifier le code, en ajoutant plus de désordre et de #if #else mais simplement :

  1. Compilez vos binaires de service dans DEBUG mode

  2. Point service installé à DEBUG binaires

  3. Exécuter le service

  4. Utilice se connecter au processus dialogue de VS pour se connecter à votre processus en cours connect to process dialog

  5. Profitez-en.

L'avantage, c'est que vous ne changez pas le code, donc c'est exactement la même chose comme vos binaires de production, ce qui, je pense, est assez important.

Bonne chance.

0voto

Tom Squires Points 2751

Essayez de suivre ce guide

EDIT : Personnellement, j'ai une application console dans le même projet qui fait tout le travail. Je demande ensuite au service d'exécuter la commande Main de l'application console. Cela facilite le débogage, notamment lors du développement.

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