Thursday, June 14, 2007

How to install and debug windows NT Services.

Support you have a Windows NT Service named YourServices.exe

 

How to install Windows NT Services?

C++:       yourService.exe �I [Parameter]

.Net:      InstallUtil yourService.exe

 

Notice: when the Windows services is installed, it will registry here:

HHEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services

 

How to uninstall Windows NT Services?

C++:     yourService.exe �u 

.Net:     InstallUtil /u yourService.exe

 

How to start Windows NT Services?

                Net start "Your Service"

 

Notice:

.Net:      "Your Service"ProjectInstaller类里 System.ServiceProcess.ServiceInstaller.ServiceName的值,它是你在Service管理器里可以看到的Service名称

C++:      

 

How to Debug Windows NT Services?

大致步骤

1. 
建立windows服务程序,不管你是用win32 API,还是ATL,还是.NET,都可以实现的。
2.
将代码写好,编译,保证没有错误。
3.
现在到了调试的过程了,首先,在IDE中,找到你要调试的地方,加上断点,然后安装好服务。
服务的安装,其实就是设计到注册表的操作。在.NET平台下,我一般习惯用installutil这个程序来安装服务。安装好之后,我们打开控制面板的"Administrator Tools",找到"Services"选项,双击打开。在服务列表中,我们能找到我们安装的服务。然后运行这个服务。
4.
现在到了关键的地方,在服务开始的时候,就会执行你的代码。为了调试的方便,在服务的代码开始处(i.e: CMyService::OnInit()) 让程序先Sleep20,这样的好处看后面你就知道了。
5.
切换回我们的IDE,在Debug菜单,里面有个Process(进程)选项。点击打开,在对话框的进程列表中,选择我们的服务相对应的进程,然后点击旁边的Attach(附加)按钮。这样,IDE就开始加载我们要调试的进程了。加载完毕之后,程序会停顿一下。(为什么?因为我们在服务的开始代码处,Sleep20秒,喝口水等一下吧)。之后,黄色的光标,跳动到你的断点处,现在就可以像以往一样,来调试这个windows服务了。
之所以在程序开始的地方Sleep20秒,是为我们在IDE附加这个Service进程的时候,留下一段缓冲的时间,不然当你的服务开始运行的时候,你的断点处的代码早就被执行过了,你断点自然不起作用了。明白了吧?呵呵。

还有一些调试windows服务小的窍门,就是写日志文件。这也是调试windows service的一个比较好的方法,虽然比较笨,但是通过阅读你自己留下的日志,也能起到不小的作用的。所以在编写程序的时候,要在关键的地方,记录日志,也是为以后程序的维护提供方便

 

总结如下:

1.       可以用Attach Process的方式调试windows service程序。

2.       对于初始化部分的代码(Init()),应为在Attach process前就已经执行了,所以可以用延时的方法Sleep()调试。

3.       如果想debug安装部分的代码,可以在Property /Debuging/Command Argument 里输入i ,再将windows services 工程设置为启动工程即可。

4.       最后就是写log的方法调试。

 

 

No comments: