2

У меня есть служба Windows, которую я хотел бы собрать некоторые отладочные данные при использовании Intellitrace - проблема в том, что вы не можете отлаживать службу Windows, запустив ее непосредственно изнутри VS. У меня установлена ​​служба, и самый первый оператор в Service.Start - «Debug.Break», который позволяет мне присоединять VS. Однако вы не можете использовать Intellitrace, если процесс уже запущен при подключении.Могу ли я использовать Intellitrace VS2010 для сбора данных для службы Windows?

Кто-нибудь знает об обходном пути для этого?

ответ

4

Это возможно с небольшой работой. Общая идея - объединить консольное приложение, которое будет вызывать методы OnStart и OnStop службы. Это не точный старт и стоп-маршрут, через который будет проходить служба, но, надеюсь, он доведёт вас до такой степени, что вы сможете диагностировать свою проблему. Я включил несколько примеров кода, чтобы дать вам общую идею.

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(); 
      } 
     } 
    } 
+0

Это не может работать любой меньше, как чемпион! Я на самом деле использовал его для создания приложения-заглушки для тестирования моей службы Windows без необходимости прикреплять отладчик вручную - у моего WinForm есть кнопка запуска и остановки, которая использует этот же код, и работает отлично. Если бы я мог, я дал вам три upvotes! – SqlRyan

0

Техника Эвана не отвечает на исходный вопрос.

Для решения см. http://blogs.msdn.com/b/msaffer/archive/2011/02/23/using-intellitrace-with-services.aspx. Вскоре создать реестр нескольких строк имя значения «окружающей среды» в разделе HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services * MYSERVICE * с тремя линиями

COR_ENABLE_PROFILING=1 
COR_PROFILER={301EC75B-AD5A-459C-A4C4-911C878FA196} 
VSLOGGERCPLAN=Put_here_the_path_to_your_CollectionPlan.xml