安装Windows服务以进行调试

时间:2011-10-17 22:51:05

标签: .net debugging windows-services onstart

我正在尝试启动我的调试版本WindowsService,但我收到的错误是它没有及时启动。

我已经清理了ctor和OnStart,但它仍然无法启动所以我想也许它加载的DLL需要更好地安装,而不是仅仅在我的项目目录的调试目录中。也许main()中的所有碰撞都悬挂在干燥?

任何调试服务的指针?我无法直接在VStudio中运行它,因为很明显,它不允许进入其OnCustomCommand(int cmd)成员并在那里打破它。

2 个答案:

答案 0 :(得分:2)

如果我理解正确,您希望能够在服务处于空闲“已启动”状态之前对其进行调试吗?

您可以使用Debugger.Break()功能。例如,我们经常在调试版本中将以下内容放入Main函数中:

#if DEBUG

if (!Debugger.IsAttached)
{
    Debugger.Break();
}

#endif

答案 1 :(得分:1)

我只会在OnStart方法中尽可能少地执行,足够的init启动完成所有工作的线程,因此您可以尽快从OnStart返回。然后在线程委托中,您可以添加Reddog的代码以打入调试器,可能在那里使用thread.sleep,这样它就可以让您有时间首先附加到进程。

另一种方法是向您的服务添加一个main方法,它可以创建服务类的实例并调用onstart / onstop,并将项目输出更改为控制台应用程序,然后您将获得两全其美的优势,它' ll作为服务通过installutil安装,你可以运行它并在visual studio中作为控制台应用程序进行调试。

详情here

如果你想只将服务调试为服务,那么我建议你的OnStart方法启动一个执行处理然后返回的线程,然后线程委托可以做一个Thread.Sleep(一段合理的时间) )然后Debugger.Break();

线程休眠使您有机会将调试器附加到进程,在使用服务控制管理器启动服务后,它会进入Debugger.Break(),这将强制调试器中断,允许您一小步。关键是在30秒之前从OnStart返回,并在遇到断点之前将调试器附加到进程。

另外,我认为Debugger.Break为您提供了附加调试器的选项,因此请在代码中尝试(不确定它是否可以很好地与服务一起使用,因为它们应该没有UI),您可能会因为坚持Debugger.Break到您的委托并在30秒之前附加到该过程。