我可以使用VS2010的Intellitrace来收集Windows服务的数据吗?

时间:2010-05-26 17:15:30

标签: .net debugging visual-studio-2010 intellitrace windows-services

我有一个Windows服务,我想收集一些关于使用Intellitrace的调试数据 - 问题是你无法通过直接从VS内部启动来调试Windows服务。我安装了服务,Service.Start中的第一个语句是“Debug.Break”,它允许我附加VS.但是,如果在附加时已启动进程,则无法使用Intellitrace。

有人知道解决方法吗?

2 个答案:

答案 0 :(得分: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();
            }
        }
    }

答案 1 :(得分:0)

Evan的技术没有回答原来的问题。

有关解决方案,请参阅http://blogs.msdn.com/b/msaffer/archive/2011/02/23/using-intellitrace-with-services.aspx。在HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ services * myservice *下用三行创建一个注册表多字符串值名称“Environment”

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