2

我有一個Windows服務,我想收集有關使用Intellitrace的一些調試數據 - 問題是您無法通過直接從VS內部啓動它來調試Windows服務。我已經安裝了該服務,並且Service.Start中的第一條語句是「Debug.Break」,它允許我連接VS.但是,如果附加進程時已經啓動,則無法使用Intellitrace。我可以使用VS2010的Intellitrace來收集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 2010-06-21 05:36:49

相關問題