Windows服务程序的调试

摘自:MSDN

    1.由于服务必须从服务控制管理器的上下文中运行,而不是从 Visual Studio 中运行,因此调试服务不像调试其他 Visual Studio 应用程序类型那样简单。若要调试服务,必须首先启动服务,然后将一个调试器附加到正在运行服务的进程中(AttachToProcess)。

     附加到服务的进程使您能够调试大多数服务代码,但并非全部;例如,由于服务已经启动,因此不能用这种方法调试服务的 OnStart 方法中的代码,或调试用于加载服务的 Main 方法中的代码。(不断循环的那块代码当然可以调试,只是不能调试初始化 服务运行环境的 线程的代码,和服务线程中初始化部分代码(初始化代码往往比较短,当然这里可以设置sleep实现增加执行时间的目的); )

   2.解决此问题的一个方法是:在唯一作用是帮助调试的服务应用程序中创建一个临时服务。可以将两个服务都安装上,然后启动此“虚拟”服务加载服务进程。临时服务启动了进程后,就可以使用 Visual Studio 中的“调试”菜单来附加到服务进程。当附加该进程之后,可以设置断点并使用这些断点来调试代码。当退出用于附加到该进程的对话框时,实际上已处于调试模式。您可以使用“服务控制管理器”开始、停止、暂停和继续您的服务,因此命中已设置的断点。调试成功后,移除此“虚拟”服务。 (刚开始看的时间一直没看明白,现在初步理解了,就是在一个Solution里面创建再创建一个临时服务项目,将这个项目与要调试的项目一同编译安装到系统服务中(此时有了连个服务A和B),然后先启动临时服务A,并附加到该服务A的进程,此时VS整个Solution进入调试状态了,这就是临时服务的目的了.现在状态下其实VS不仅在监视着服务A进程,而且在此时启动服务B的进程的话VS也会自动地附加上,因此我们可以自由地在任何地方设置断点了,哈哈 ;其实并非一定要是个临时服务项目,只要是个不停执行不会自动结束的项目应该都是可以的,目的就是让VS进入Debug状态,能够自动附加上进程B就可以了 )

    3.DbgBreakPoint 或者 DebugBreak(在x86机器上加入一条int 3汇编指令)(相当于在编译后的程序中增加了调试异常,在程序到达断点时会自动跳出即时调试窗口,和普通程序出错时的窗口相似,只要选择调试并选择打开了源码VS进行调试即可,有点像以前开发JS及动态网站用的调试方法,本人认为这种方法最简单可行了,推荐一下 )

   注意了:调试 OnStart 方法可能比较困难,因为 Windows 服务管理器将所有尝试启动服务的时间限制在 30 秒内。(这点是Windows固定的时间,估计应该有地方能够修改该限制,不过本人没有找到,有同学找到了告诉俺哈,:-),现在我们做的最好是把初始化服务运行环境的代码尽可能简化,把与服务实际相关的信息初始化,放在服务主函数中执行好了 .否则那你只会有30秒钟时间看前面代码的运行了,如果有自信那么快完成调试的话也可以写前面了,本人能力是不是很足了,囧 )

你可能感兴趣的:(windows)