windows service 之调试过程

最近第一次用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 后,得到的一些方法。以待今后继续积累。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值