web-dev-qa-db-fra.com

Service de débogage Windows

Scénario

J'ai un service Windows écrit en C # . J'ai lu toutes les discussions sur Google pour le déboguer, mais je n'arrive toujours pas à le faire fonctionner . J'ai exécuté "PathTo.NetFramework\InstallUtil.exe C:\MyService.exe ". Il a dit que l'installation a réussi, cependant, lorsque j'exécute "Services.msc", le service n'est pas affiché du tout, nulle part. Si je vais dans le Gestionnaire des tâches, il y a un processus appelé "MyService.vshost.exe". Je suis presque sûr que ce n'est pas ça, parce que c'est un service, pas un processus.

Quelqu'un peut-il m'expliquer?

Si je suis censé voir le service lorsque j'exécute Services.msc? (Sachant que tout cela est effectué sur une machine locale, sans serveur AT ALL.

Autre

Je cours VS2008.

MODIFIER:

Tout cela se fait sur ma machine locale, je n'ai ni serveur ni accès à aucun ..__En outre, je ne sais même pas ce que fait le service, je veux le déboguer pour pouvoir parcourir le code et voir comment il fonctionne. tout fonctionne (le code à l'intérieur du service, pas le service lui-même - pour l'un de vous smarty pantalons qui pourraient suggérer que je regarde un modèle).

EDIT 2:

AUCUN DE CEUX-CI NE TRAVAILLE! Chaque fois que j'essaie quelque chose, un message m'indique de devoir utiliser NET START ou d'installer le service.

EDIT 3:

Je cours VS2008.

J'ai tapé ceci: C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\InstallUtil.exe C:\dev\Restarter\bin\Release\Restarter.exe

J'ai obtenu ceci: Utilitaire d’installation de Microsoft .NET Framework Version 2.0.50727.3053 Copyright (c) Microsoft Corporation. Tous les droits sont réservés.

Exécuter une installation transactionnelle.

Début de la phase d'installation de l'installation . Consultez le contenu du fichier journal pour C:\dev\Restarter\bin\ Release\Restarter.exe Progression de l'assemblage . Le fichier se trouve à l'emplacement C:\dev\Restarter\bin\Release\EDT.Restar ter.InstallLog . Installation de l’assemblage 'C:\dev\Restarter\bin\Release\Restarter.exe' . Les paramètres concernés sont les suivants: logtoconsole = assemblypath = C:\dev\Restarter\bin\Release\Restarter.exe logfile = C:\dev\Restarter\bin\Release\Restarter.InstallLog

La phase d'installation s'est terminée avec succès et la phase de validation commence ........ Consultez le contenu du fichier journal pour C:\dev\Restarter\bin\ Release\Restarter.exe Progression de l'assemblage . Le fichier se trouve dans C:\dev\Restarter\bin\Release\Restar ter.InstallLog . Validation de l’assemblage 'C:\dev\Restarter\bin\Release\Restarter.exe' . Les paramètres concernés sont les suivants: : logtoconsole = assemblypath = C:\dev\Restarter\bin\Release\Restarter.exe logfile = C:\dev\Restarter\bin\Release\Restarter.InstallLog

La phase de validation s'est terminée avec succès.

L'installation effectuée est terminée.

C:\Programmes\Microsoft Visual Studio 9.0\VC>

Je suis ensuite allé à RUN -> Services.msc Je ne peux rien y voir.

Il existe un processus dans le Gestionnaire des tâches appelé "Restarter.vshost.exe".

C'est tout.

Je voulais seulement l'installer et le déboguer . Je sais que cela fonctionne (car il fonctionne et ne tombe pas en panne) . Mais le code a été écrit par un ami et je veux comprendre le code sous-jacent en parcourant en mode débogage.

41
Goober

Je recommande le modèle suivant pour le débogage:

 var ServiceToRun = new SomeService(); 
 if (Environment.UserInteractive)
 {
    // This used to run the service as a console (development phase only)

    ServiceToRun.Start();

    Console.WriteLine("Press Enter to terminate ...");
    Console.ReadLine();

    ServiceToRun.DoStop();
 }
 else
 {
    ServiceBase.Run(ServiceToRun);
 }

Edit: assurez-vous que votre cible est une application console, et non une application Windows, sinon elle ne fonctionnera pas.

115
Andrey

vous pouvez le déboguer en attachant le débogueur au processus. Vous pouvez le faire en ajoutant une ligne au démarrage de votre programme:

Debugger.Launch ();

après avoir ajouté l'instruction using:

using System.Diagnostics; 

soit vous aurez besoin de mettre cela dans un bloc conditionnel ou de le supprimer quand vous aurez fini de déboguer

ou en exécutant le service puis en joignant le processus manuellement à partir de l'EDI: Debug-> Attach to process.

23
Sam Holder

Nous pouvons rendre le projet de service Windows débogable en ajoutant simplement un paramètre et en le faisant se comporter comme une application de console.

1) Allez dans les propriétés de votre projet de service Windows -> Debug -> Options de démarrage 2) Donnez un argument -Console 3) Allez dans l’onglet Application -> type de sortie, changez le en Console Application 4) Tapez le code ci-dessous dans Program.cs 

static class Program
    {
        private static EventWaitHandle _waitHandle;
        private static Service1 _service;
                static void Main(string[] args)
        {
            bool runConsole = false;**

            foreach (string arg in args)
            {
                if (arg.ToLowerInvariant().Equals("-console"))
                {
                    runConsole = true;
                }
            }   

            _service = new Service1();
            if (runConsole)
            {
                _waitHandle = new EventWaitHandle(false, EventResetMode.ManualReset);
                Console.WriteLine("Starting Workflow Service in Console Mode");
                Console.WriteLine("Press Ctrl+C to exit Console Mode");
               Console.CancelKeyPress += new ConsoleCancelEventHandler(OnCancelKeyPress);
                _service.InternalStart();
                WaitHandle.WaitAll(new WaitHandle[] { _waitHandle });
            }

            ServiceBase[] ServicesToRun;
            ServicesToRun = new ServiceBase[] 
            { 
                new Service1() 
            };
            ServiceBase.Run(ServicesToRun);
        }

        static void OnCancelKeyPress(object sender, ConsoleCancelEventArgs e)
        {
            _service.InternalStop();
            _waitHandle.Set();
        }


    }
6
Lavanya

Cela m'a beaucoup aidé lors du développement/débogage des services Windows:

http://windowsservicehelper.codeplex.com/

Appuyez simplement sur F5 pour déboguer. Très facile. 

L'approche de Andreï est également très bonne.

5
Ronnie Overby

Pour pouvoir déboguer mon service sans le déployer, je l'écris toujours de la manière suivante:

Dans votre fichier program.cs:

#if DEBUG
    MyService myService = new MyService();
    myService.OnDebug();
    System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite);
#else
    ServiceBase[] ServicesToRun;
    ServicesToRun = new ServiceBase[]
    {
        new MyService()
    };
    ServiceBase.Run(ServicesToRun);
#endif

et dans votre fichier MyService.cs:

    public void OnDebug()
    {
        OnStart(null);
    }

* NOTE * : Vous devez créer en mode "Release" lorsque vous avez terminé le débogage et que vous êtes prêt à déployer le service, sinon le service ne sera pas considéré comme un service.

J'espère que cela t'aides.

4
Minas

Hypothèses:

1) Vous avez le code source disponible dans une solution dans l'IDE VS2008

Comment je débogue les services C #:

  1. Installez le service en utilisant InstallUtil. (Vous semblez avoir déjà fait ça)
  2. (Si nécessaire) Modifiez le chemin du service en MyService.exe généré dans le dossier bin de votre solution
  3. Mettez quelque chose comme ceci au début de la méthode OnStart() de votre service:

    while(true)
    {
       System.Threading.Thread.Sleep(500);
    }
    
  4. Placez un point d'arrêt sur System.Threading.Thread.Sleep(500)

  5. Construire la solution

  6. Démarrez votre service à l’aide de Windows Service Utility

  7. Pendant le démarrage de votre service, dans VS2008, passez à Debug -> Attach To Processes...

  8. Assurez-vous que Show Processes From All Users et Show Processes In All Sessions sont cochés

  9. Recherchez votre MyService.exe dans la liste et cliquez sur Attach.

  10. Vous devriez maintenant être au point d'arrêt que vous avez inséré dans la boucle infinie

  11. Faites glisser le contrôle (flèche jaune) seulement en dehors de la boucle infinie

  12. Déboguer!

Avertissement:

N'oubliez pas de supprimer la boucle infinie lorsque vous souhaitez publier une construction ou simplement exécuter le service normalement.

2
Onion-Knight

Il se peut que le nom du service ne soit pas ce que vous attendez et que vous ne puissiez pas le trouver. Le nom du service est défini dans les propriétés ServiceInstaller du projet .NET et ne doit en aucun cas correspondre au nom de l'exécutable. Mais si vous êtes sûr que le service ne figure pas dans la liste après l'installation, voici ce que vous pouvez faire.

Tout d'abord, l'installation du service. Il y a 2 méthodes, InstallUtil.exe et SC.exe. Le premier est spécialement conçu pour les services .NET car il exécutera tout le code ProjectInstaller et ServiceInstaller. La seconde ne le fera pas mais vous donnera plus d’options et est généralement plus efficace, c’est-à-dire qu’elle est susceptible de réussir lorsque InstallUtil échoue. Cela peut arriver quand il y a une exception dans n'importe quel code d'installation.

Vous avez déjà essayé d'installer avec InstallUtil alors voici la version SC:

sc create MyService binPath= "C:\Service.exe"

Notez que MyService est le nom vous donnez le service à ce stade et que cela peut être tout ce que vous voulez (dans des limites raisonnables :-). Ce nom sera affiché dans la liste de la console de services.

Une fois votre service installé, vous devez le déboguer correctement lorsque OnStart est appelé. Cela peut être réalisé en exécutant et en joignant un débogueur (Visual Studio) à partir du service:

protected override void OnStart(string[] args)
{
    #if DEBUG
    Debugger.Launch();
    #endif
    ...
}

N'oubliez pas de créer et de remplacer le service exécutable après ce changement de code. Le service doit être arrêté mais il n'est pas nécessaire de le désinstaller et de le réinstaller.

Pour supprimer le service à l'aide de SC:

sc delete MyService
1
Maciej

Je recommande d'ajouter /test sur l'onglet de débogage des propriétés du projet comme option de démarrage. Ensuite, vous pouvez exécuter votre service sans avoir à l'installer.

0

Si votre couche métier est distincte du service Windows, vous pouvez tester toutes vos fonctions métier en dehors de l'exécution du service Windows. 

Pour tester le service Windows, j'aime créer un projet de test qui est une application console et je démarre un nouveau thread qui exécute mon service. 

System.Threading.Thread sftpThread = new System.Threading.Thread((ThreadStart)service1);
service1.Start();
0
Dan H

Je l'ai récemment ajouté à un projet et cela fonctionne très bien pour moi. Vous pouvez le déboguer comme n'importe quel autre EXE. Une fois celui-ci ajouté, accédez aux propriétés de votre projet et ajoutez un paramètre de ligne de commande (/ EXE) dans l'onglet Débogage pour la configuration de la construction Debug.

<MTAThread()> _
Shared Sub Main()

    '' 
    '' let's add a command line parameter so we can run this as a regular exe or as a service
    ''
    If Command().ToUpper() = "/EXE" Then
        Dim app As MyService = New MyService()

        app.OnStart(Nothing)
        Application.Run()
    Else
        Dim ServicesToRun() As System.ServiceProcess.ServiceBase

        ' More than one NT Service may run within the same process. To add
        ' another service to this process, change the following line to
        ' create a second service object. For example,
        '
        '   ServicesToRun = New System.ServiceProcess.ServiceBase () {New Service1, New MySecondUserService}
        '
        ServicesToRun = New System.ServiceProcess.ServiceBase() {New MyService}

        System.ServiceProcess.ServiceBase.Run(ServicesToRun)
    End If
End Sub
0
Greg Bogumil

Si vous créez votre service avec TopShelf, vous devriez pouvoir le déboguer facilement à partir de Visual Studio.

0
Efe Ariaroo