Могу ли я использовать Intellitrace VS2010 для сбора данных для службы Windows?
У меня есть служба Windows, которую я хотел бы собрать для отладки данных об использовании Intellitrace - проблема в том, что вы не можете отладить службу Windows, запустив ее непосредственно из VS. У меня установлена служба, и самым первым оператором в Service.Start является "Debug.Break", который позволяет мне подключать VS. Однако вы не можете использовать Intellitrace, если процесс уже запущен при подключении.
Кто-нибудь знает обходной путь для этого?
2 ответа
Это возможно с небольшим количеством работы. Общая идея состоит в том, чтобы создать макет консольного приложения, которое будет вызывать методы сервиса 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. Вскоре создайте имя многострочного значения реестра "Environment" в 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