调试Windows服务 [英] Debugging Windows Service

查看:86
本文介绍了调试Windows服务的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

大家好,

我正在尝试使用Debugger.Break()方法调试Windows服务.在服务OnStart()方法上,我正在调用我的业务逻辑(QueueProcessor.StartProcessing()
)每1秒处理一次消息队列项.我将断点(Debugger.Break())保留在startprocessing方法中.
现在,当我启动该服务时,会弹出Visual Studio即时调试器,但是当我单击以调试该服务时,什么也没有发生,并且在一段时间后弹出以下消息
发生了致命错误,需要终止调试.有关更多详细信息,请访问Microsoft帮助和支持网站. HRESULT = 0x80131c08. ErrorCode = 0x0&;
基本上,我无法调试Windows服务.


在我的Program.cs文件中查找用于加载服务的代码.

静态void Main()
       {

           //#if DEBUG
           //System.Diagnostics.Debugger.Launch();
           //#endif
           ServiceBase [] ServicesToRun;
           ServicesToRun =新的ServiceBase []
                             {
                   新的TravelMailService()
                             };
           ServiceBase.Run(ServicesToRun);
       }


-------------------------------------------------- ---------------------
在服务OnStart上出现以下提示.

公共局部类TravelMailService:ServiceBase
    {
      计时器timer = new Timer();
      公共TravelMailService()
       {
           InitializeComponent();
       }

      受保护的重写void OnStart(string [] args)
       {
           timer.Interval = 1000;
           timer.Elapsed + = new ElapsedEventHandler(timer_Elapsed);
           timer.AutoReset = true;
           timer.Enabled = true;
           timer.Start();
       }

       void timer_Elapsed(对象发送者,ElapsedEventArgs e)
       {
           QueueProcessor.StartProcessing();                    //这是我保留断点的业务逻辑
       }

      受保护的重写void OnStop()
       {
           QueueProcessor.StopProcessing();
           timer.AutoReset = false;
           timer.Enabled = false;  
       }

    }

最后,这就是服务正在调用的我的业务逻辑.


公共类QueueProcessor
    {
      私有静态MessageQueue msgQ = null;
      私有静态对象lockObject = new object();

      公共静态void StartProcessing()
       {
           Debugger.Break();                        //代码在这里没有破损.
          字符串queuePath = @".\ private $ \ websiteemails" ;;
           InsureQueueExists(queuePath);
           msgQ =新的MessageQueue(queuePath);
           //msgQ.Formatter = new BinaryMessageFormatter();
           msgQ.MessageReadPropertyFilter.SetAll();
           msgQ.ReceiveCompleted + =新的ReceiveCompletedEventHandler(msgQ_ReceiveCompleted);
           msgQ.BeginReceive();
           //while(Console.ReadKey().Key!= ConsoleKey.Q)
           //{
           //    //按q退出.
           //     Thread.Sleep(0);
           //}
       }

      静态无效msgQ_ReceiveCompleted(对象发送者,ReceiveCompletedEventArgs e)
       {
          锁(lockObject)
           {
                             EmailMessage msg =(EmailMessage)e.Message.Body;
                             MailHelper.SendMailMessage(msg.from,msg.to,null,null,msg.subject,msg.message,null);
           }
           //听下一条消息.
           msgQ.BeginReceive();
       }
}

早期的答案很受重视.
预先感谢.

Hi Everyone,

I am trying to debug a windows service using the Debugger.Break() method.On the service OnStart() method i am calling my business logic(QueueProcessor.StartProcessing()
) to process the message queue items every 1sec.I have kept my breakpoint(Debugger.Break())in the startprocessing method.
Now When i starting the service the Visual Studio Just In Time Debugger is popping up but when i click to debug the service nothing happens and after some time following message pops up
"A fatal error has occurred and debugging needs to be terminated. For more details, please see the Microsoft Help and Support web site. HRESULT=0x80131c08. ErrorCode=0x0"
Basically I am not able to debug my windows service.


Follwing the code in my Program.cs file which is used to load the service.

static void Main()
        {

            //#if DEBUG
            //System.Diagnostics.Debugger.Launch();
            //#endif
            ServiceBase[] ServicesToRun;
            ServicesToRun = new ServiceBase[]
                {
                    new TravelMailService()
                };
            ServiceBase.Run(ServicesToRun);
        }


-----------------------------------------------------------------------
On Service OnStart follwing thigs occurs.

public partial class TravelMailService : ServiceBase
    {
        Timer timer = new Timer();
        public TravelMailService()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            timer.Interval = 1000;
            timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
            timer.AutoReset = true;
            timer.Enabled = true;
            timer.Start();
        }

        void timer_Elapsed(object sender, ElapsedEventArgs e)
        {
            QueueProcessor.StartProcessing();                    //This is the business logic where i have kept my breakpoint
        }

        protected override void OnStop()
        {
            QueueProcessor.StopProcessing();
            timer.AutoReset = false;
            timer.Enabled = false;  
        }

    }

And Finally this is my business logic which service is calling.


public class QueueProcessor
    {
        private static MessageQueue msgQ = null;
        private static object lockObject = new object();

        public static void StartProcessing()
        {
            Debugger.Break();                        //Code not breaking here.
            string queuePath = @".\private$\websiteemails";
            InsureQueueExists(queuePath);
            msgQ = new MessageQueue(queuePath);
            //msgQ.Formatter = new BinaryMessageFormatter();
            msgQ.MessageReadPropertyFilter.SetAll();
            msgQ.ReceiveCompleted += new ReceiveCompletedEventHandler(msgQ_ReceiveCompleted);
            msgQ.BeginReceive();
            // while (Console.ReadKey().Key != ConsoleKey.Q)
            //{
            //    // Press q to exit.
            //     Thread.Sleep(0);
            //}
        }

        static void msgQ_ReceiveCompleted(object sender, ReceiveCompletedEventArgs e)
        {
            lock (lockObject)
            {
                EmailMessage msg = (EmailMessage)e.Message.Body;
                MailHelper.SendMailMessage(msg.from, msg.to, null, null, msg.subject, msg.message, null);
            }
            // Listen for the next message.
            msgQ.BeginReceive();
        }
}

An early answer is higly valued.
Thanks in advance.

推荐答案

尝试关注,我希望它能起作用...

Try following, i hope this works...

http://msdn.microsoft.com/en-us/library/7a50syb3(VS.80).aspx

http://support.microsoft.com/kb/824344

谢谢


这篇关于调试Windows服务的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆