我有一個Windows服務,我想收集有關使用Intellitrace的一些調試數據 - 問題是您無法通過直接從VS內部啓動它來調試Windows服務。我已經安裝了該服務,並且Service.Start中的第一條語句是「Debug.Break」,它允許我連接VS.但是,如果附加進程時已經啓動,則無法使用Intellitrace。我可以使用VS2010的Intellitrace來收集Windows服務的數據嗎?
有誰知道一種解決方法嗎?
我有一個Windows服務,我想收集有關使用Intellitrace的一些調試數據 - 問題是您無法通過直接從VS內部啓動它來調試Windows服務。我已經安裝了該服務,並且Service.Start中的第一條語句是「Debug.Break」,它允許我連接VS.但是,如果附加進程時已經啓動,則無法使用Intellitrace。我可以使用VS2010的Intellitrace來收集Windows服務的數據嗎?
有誰知道一種解決方法嗎?
這是可能的一點點的工作。總體思路是模擬將調用服務的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();
}
}
}
埃文的技術不回答原來的問題。
有關解決方案,請參見http://blogs.msdn.com/b/msaffer/archive/2011/02/23/using-intellitrace-with-services.aspx。不久下創建HKEY_LOCAL_MACHINE \ SYSTEM註冊表多字符串值命名爲「環境」 \ CURRENTCONTROLSET \服務爲MyService * *三行
COR_ENABLE_PROFILING=1
COR_PROFILER={301EC75B-AD5A-459C-A4C4-911C878FA196}
VSLOGGERCPLAN=Put_here_the_path_to_your_CollectionPlan.xml
這不能工作的任何少如飛!我已經用它創建了一個存根應用程序來測試我的Windows服務,而無需手動附加調試器 - 我的WinForm只有一個使用相同代碼的啓動和停止按鈕,並且它完美地工作。如果可以的話,我已經給你三個upvotes了! – SqlRyan 2010-06-21 05:36:49