53 votes

Comment déboguer la méthode .NET Windows Service OnStart?

J'ai le code écrit dans .NET qui échoue seulement lorsque installé en tant que service Windows. L'échec n'est pas autoriser le service à même de commencer. Je ne peux pas comprendre comment je peux rentrer dans la méthode OnStart.

Comment faire pour Déboguer les Applications de Service Windows donne une délicieuse idée:

Fixation au processus du service vous permet de corriger la plupart, mais pas tous, le service de code; par exemple, parce que le service a déjà été commencé, vous ne pouvez pas déboguer le code dans la méthode OnStart de cette façon, ou le code de la méthode main qui est utilisé pour charger le service. Une façon de contourner cela est de créer un temporaire deuxième service dans votre application de service qui n'existe que pour faciliter le débogage. Vous pouvez installer les deux services, et puis commencer cette "factice" service charge le processus de service. Une fois le service temporaire a commencé le processus, vous pouvez utiliser le menu Débogage dans Visual Studio pour attacher au processus de service.

Cependant, je ne suis pas clair comment il est exactement ce que vous êtes censé créer le service fictif de charger le processus de service.

96voto

palehorse Points 8268

Une solution temporaire consiste à lancer le débogueur en tant que première ligne de code dans OnStart.

 System.Diagnostics.Debugger.Launch()
 

Cela vous demandera le débogueur que vous souhaitez utiliser. Ayez simplement la solution déjà ouverte dans Visual Studio et choisissez cette instance dans la liste.

10voto

SpaceghostAli Points 3732

J'ai tendance à ajouter une méthode comme celle-ci:

     [Conditional("DEBUG")]
    private void AttachDebugger()
    {
        Debugger.Break();
    }
 

il ne sera appelé que sur les versions Debug de votre projet et il mettra en pause l'exécution et vous permettra d'attacher le débogueur.

8voto

Contango Points 7976

Une fois que vous avez un service qui est installé à l'aide d' installutil.exe, vous pouvez modifier l' Start Parameters de sauter dans le débogueur si le service est démarré:

enter image description here

Lorsque vous démarrez manuellement le service avec le paramètre -debugWithVisualStudio (ou plus simplement" -d), il détecte automatiquement le bon projet, et le feu interactif débogueur de Visual Studio:

enter image description here

À l'appui de cette fonctionnalité, modifier le service de l' OnStart() fonction de:

/// <summary>
///     Executed when the service is started.
/// </summary>
/// <param name="args">Command line arguments.</param>
protected override void OnStart(string[] args)
{
    try
    {
        //How to debug when running a Windows Service:
        // 1. Right click on the service name in Windows Service Manager.
        // 2. Select "Properties".
        // 3. In "Start Parameters", enter "-d" (or "-debugWithVisualStudio").
        // 4. Now, when you start the service, it will fire up Visual Studio 2012 and break on the line below.
        // 5. Make sure you have UAC (User Access Control) turned off, and have Administrator privileges.
#if DEBUG
        if (((ICollection<string>)args).Contains("-d")
            || ((ICollection<string>)args).Contains("-debugWithVisualStudio"))
        {
            Debugger.Launch(); // Launches VS2012 debugger.
        }
#endif
        ShellStart(args);
        base.OnStart(args);
    }
    catch (Exception ex)
    {
        // Log exception here.
    }
}

(facultatif) Si vous souhaitez restreindre l'exacte ligne de code où le service est de lancer une erreur, mettez-les exceptions à partir du menu Visual Studio DEBUG .. Exceptions. Lorsque vous continuez à le débogage, il s'arrête sur la ligne exacte qui est en train de lancer une exception.

enter image description here

7voto

Clark Kent Points 5845

Cela fonctionne très bien!

 protected override void OnStart(string[] args)
{
    System.Diagnostics.Debugger.Launch();
}
 

5voto

Boris Hurinek Points 41

Les options ci-dessus ne semblent pas fonctionner sous Windows 8.

J'ai ajouté Thread.Sleep (15000); dans ma méthode OnStart () et définir un point d'arrêt sur la ligne suivante du code. Cela me donne 15 secondes pour attacher le débogueur VS à mon processus après le démarrage du service et me permet de déboguer correctement la méthode OnStart ().

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: