Question

J'ai un service Windows que je voudrais recueillir des données de débogage sur l'utilisation IntelliTrace - le problème est que vous ne pouvez pas déboguer un service Windows en démarrant directement à partir de l'intérieur VS. J'ai installé le service et la première déclaration Service.Start est « Debug.Break », ce qui me permet de joindre VS. Cependant, vous ne pouvez pas utiliser IntelliTrace si un processus est déjà commencé lorsque vous connectez.

Quelqu'un sait-il d'une solution de contournement pour cela?

Était-ce utile?

La solution

Il est possible avec un peu de travail. L'idée générale est de se moquer d'une application de la console qui appellera les méthodes onStart et onStop du service. Ce n'est pas le début exact et le chemin d'arrêt d'un service passera par mais nous espérons qu'il vous arriver au point que vous pouvez diagnostiquer votre problème. J'ai inclus quelques exemples de code pour vous donner une idée générale.

ConsoleMock.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using WindowsService1;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Service1 s1 = new Service1();
            while (true)
            {
                Console.WriteLine(">1 Start\n>2 Stop");
                string result = Console.ReadLine();
                if (result == "1")
                {
                    var method = s1.GetType().GetMethod("OnStart", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
                    method.Invoke(s1, new object[] { args });
                }
                else if (result == "2")
                {
                    var method = s1.GetType().GetMethod("OnStop", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
                    method.Invoke(s1, new object[] { });
                }
                else
                {
                    Console.WriteLine("wrong command");
                }
            }
        }
    }
}


Service.cs:
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Diagnostics;
    using System.Linq;
    using System.ServiceProcess;
    using System.Text;
    using System.Threading;

    namespace WindowsService1
    {
        public partial class Service1 : ServiceBase
        {
            private long serviceCounter;
            private Thread workerThread;

            public Service1()
            {
                InitializeComponent();
                serviceCounter = 0;

            }

            public void Worker()
            {
                while (true)
                {
                    serviceCounter += 1;
                    System.Threading.Thread.Sleep(500);

                    try
                    {
                        throw new Exception(serviceCounter.ToString());
                    }
                    catch (Exception)
                    {
                    }
                }
            }

            protected override void OnStart(string[] args)
            {
                workerThread = new Thread(new ThreadStart(Worker));
                workerThread.Start();
            }

            protected override void OnStop()
            {
                workerThread.Abort();
            }
        }
    }

Autres conseils

La technique de Evan ne répond pas à la question initiale.

Pour une solution voir http://blogs.msdn.com/b/msaffer/archive/2011/02/23/using-intellitrace-with-services.aspx . Peu de temps créer un nom de valeur multi-chaîne Registre "Environnement" sous HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services * myservice * avec trois lignes

COR_ENABLE_PROFILING=1
COR_PROFILER={301EC75B-AD5A-459C-A4C4-911C878FA196}
VSLOGGERCPLAN=Put_here_the_path_to_your_CollectionPlan.xml
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top