调试Windows服务及加载到服务中的DLL
1. 概述
在调试代码时,除了设备驱动程序,最难调试的就是Microsoft Windows服务以及加载到服务中的DLL了。你可能认为,由于服务本质上只是没有用户界面的用户模式进程,调试它们应该和调试控制台应用程序一样简单。但实际上并非如此,Windows服务和加载到服务中的DLL涉及诸多问题,尤其是与Windows安全相关的问题,这可能会让你在调试时感到无比抓狂。
在早期的Microsoft Windows NT时代,很少有开发者编写服务,甚至很多人都不知道服务是什么。然而,在如今的COM+、Microsoft Internet Information Services (IIS)、Microsoft Exchange Server扩展和Windows集群的环境下,许多开发者不得不开始处理服务并对其进行调试。
2. 服务基础
服务具有以下三个基本特征:
- 服务可能会一直运行,即使计算机无人登录或刚启动时也不例外。
- 服务没有用户界面。
- 服务可以由本地和远程客户端进行管理和控制。
在决定是将应用程序编写为服务还是普通的用户模式应用程序时,你需要自问正在解决的开发问题是否具备这三个要求。如果具备,那么你应该考虑将应用程序编写为服务。如果你决定编写服务并希望能够对其进行调试,就必须确保自己对服务的运行方式有深入的了解。
以编写一个监控不间断电源(UPS)的应用程序为例,UPS软件需要做的就是监控UPS硬件何时报告电源故障,并在电源中断时启动受控关机。显然,如果UPS软件不是一直运行(判断应用程序是否应作为服务的第一个标准),那么关机操作就不会发生,当