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就开始加载我们要调试的进程了。加载完毕之后,程序会停顿一下。(为什么?因为我们在服务的开始代码处,Sleep了20秒,喝口水等一下吧)。之后,黄色的光标,跳动到你的断点处,现在就可以像以往一样,来调试这个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:
Post a Comment