zoukankan      html  css  js  c++  java
  • windows Service 之调试过程

    转http://www.cnblogs.com/peak-weng/archive/2008/05/30/1210538.html

     最近第一次用C#写了一个windows service ,其实实现的内容比较简单。就是启动remoting 连接,但是调试相对初次写windws service 的我来说,比较烦。没有经验,而且没办法像调试其他windows 程序一样设置断点,无法看到运行过程。经过查看一些相关资料后,有了一点点调试的心得。特此留笔,以待今后使用。
     
    相关源码:

    static void Main()
            {
                ServiceBase[] ServicesToRun;

                
    // 同一进程中可以运行多个用户服务。若要将
                
    // 另一个服务添加到此进程中,请更改下行以
                
    // 创建另一个服务对象。例如,
                
    //
                
    //   ServicesToRun = new ServiceBase[] {new Service1(), new MySecondUserService()};
                
    //
                ServicesToRun = new ServiceBase[] { new TeamWorldService() };

                ServiceBase.Run(ServicesToRun);
                
    //TeamWorldService obj = new TeamWorldService();
                
    //obj.OnStart();
            }



    TeamWorldService :

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Diagnostics;
    using System.ServiceProcess;
    using System.Text;
    using System.IO;
    using Tribal.TeamWorld.API;
    using Tribal.BaseClasses;
    using Tribal.TeamWorld.Remoting;
    using Tribal.TeamWorld.Implementation;

    namespace Tribal.TeamWorld.Service
    {
        
    partial class TeamWorldService : ServiceBase
        {
            
    private RemotingInterface _remotingInterface = null;
            
    private MainController _mainController = null;
            
    public TeamWorldService()
            {
                InitializeComponent();
    //
                
            }

            
    protected override  void OnStart(string[] args)
            {
                
    this.AddTextLine("Starting server  ( " + DateTime.Now.ToString() + " )");

                
    try
                {
                    
    this.AddTextLine("Initializing MainController ");
                    
    this._mainController = MainController.GetInstance();
                }
                
    catch (Exception ex)
                {
                    
    this.PrintExceptions(ex);
                }

                
    if (this._mainController != null)
                {
                    
    this.AddTextLine("Connecting userinterface to LogController ");
                }

                
    try
                {
                    
    this.AddTextLine("Starting MainController");
                    
    this._mainController.Start();
                }
                
    catch (Exception exc)
                {
                    
    this.PrintExceptions(exc);
                }

                
    try
                {
                    
    this.AddTextLine("Starting .NET RemotingInterface");
                    
    this._remotingInterface = new RemotingInterface();
                    
    this._remotingInterface.StartServing();
                }
                
    catch (Exception exc)
                {
                    
    this.PrintExceptions(exc);
                }
            }

            
    protected override void OnStop()
            {
                
                
    this._remotingInterface.StopServing();
                
    this._mainController.Stop();
                
    this.AddTextLine("End .NET RemotingInterface");
                
            }

            
    private void PrintExceptions(Exception exc)
            {
                Exception current 
    = exc;
                
    while (current != null)
                {
                    
    this.AddTextLine(current.Message);
                    
    this.AddTextLine(current.StackTrace);

                    current 
    = current.InnerException;
                }
            }


            
    private void AddTextLine(string line)
            {
                
    try
                {
                    FileStream fs 
    = new FileStream(@"C:\TeamWorldServiceLog.txt", FileMode.OpenOrCreate, FileAccess.Write);

                    StreamWriter m_streamWriter 
    = new StreamWriter(fs);

                    m_streamWriter.BaseStream.Seek(
    0, SeekOrigin.End);

                    m_streamWriter.WriteLine(line
    + "\r\n");

                    m_streamWriter.Flush();

                    m_streamWriter.Close();

                    fs.Close();
                }
                
    catch (Exception ex)
                { 
                    
                }
            }
        }
    }


    方法1:写日志
            是最传统的调试windows service方法,也是大家在调试service 比较管用的方式,但是,调试起来还是不太明朗。你要在你认为可能出现错误的地方全部添加写日志的方法。我上面的代码就采用了AddTextLine 函数实现的这种方法。

    方法2:附加进程
            附加进程的方法可以像调试正常的widows程序一样,设置断点进行单步调试。但是,我必须在安装启动服务后,才可以进行附加此服务进程,可在附加的同时OnStart 函数已经执行完毕,所以对Onstart 无法调试。但是我可以通过设置启动服务延时来加载调试。
            步骤如下:
                         1,设置启动服务延时,
                               

    复制代码
    private System.Timers.Timer timerDelay;

            
    protected override void OnStart(string[] args)
            {
                
    try
                {
                    
                    
    ///delay start the SynData 30seconds
                    timerDelay = new System.Timers.Timer(30000);   
                    timerDelay.Elapsed 
    += new System.Timers.ElapsedEventHandler(timerDelay_Elapsed);
                    timerDelay.Start();
                }
                
    catch (Exception ex)
                {
                    
    this.PrintExceptions(ex);
                }
            }

            
    void timerDelay_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
            {
                timerDelay.Enabled 
    = false;
                timerDelay.Close();
                
    //你要加的代码
                
    //.To do..
            }
    复制代码

                          注意:正常服务的启动时间为30秒左右,当服务启动时间超过30秒会报错!,所以不要在OnStart中做过多的操作,也可以用这种延时的方法启动服务,以防在启动服务时超时。
                         2、首先要对服务进行安装,然后启动服务。
                         3、打开vs2005  调试—>附加到进程,选择你的服务进程(如果找不到可以勾选 显示所有用户的进程),就可以了。
                            进程.jpg
    方法3:
          我认为是这次调试对我帮助最大。
          在Main 函数中,注释掉原有自动生成的代码,注意红字部分是要根据自己的服务名字来手工添加的
                 // ServiceBase[] ServicesToRun;

                // 同一进程中可以运行多个用户服务。若要将
                
    // 另一个服务添加到此进程中,请更改下行以
                
    // 创建另一个服务对象。例如,
                
    //
                
    //   ServicesToRun = new ServiceBase[] {new Service1(), new MySecondUserService()};
                
    //
                //ServicesToRun 
    = new ServiceBase[] { new TeamWorldService() };

                //ServiceBase.Run(ServicesToRun);
                //******************************************
                
    TeamWorldService obj = new TeamWorldService();
                
    obj.OnStart();

                //******************************************
          然后把 protected override  void OnStart(string[] args) 改为 public void OnStart()。
          ,设置你的断点,按 F5 运行就可以调试了。

    以上是自己这次调试widows service 后,得到的一些方法。以待今后继续积累。

  • 相关阅读:
    ubuntu 14.04搭建PHP项目基本流程
    linux下 lvm 磁盘扩容
    LVM基本介绍与常用命令
    Linux LVM逻辑卷配置过程详解
    mysql 5.7中的用户权限分配相关解读!
    linux系统维护时的一些小技巧,包括系统挂载新磁盘的方法!可收藏!
    linux系统内存爆满的解决办法!~
    源、更新源时容易出现的问题解决方法
    NV显卡Ubuntu14.04更新软件导致登录死循环,不过可以进入tty模式
    一些要注意的地方
  • 原文地址:https://www.cnblogs.com/jameshappy/p/3091287.html
Copyright © 2011-2022 走看看