我可以将调试器预先附加到服务吗?

时间:2010-03-09 16:35:52

标签: debugging windows-services

我有一个Windows服务,我希望看到它启动时正在做什么。通常为了完成这样的事情,我会对Thread.Sleep进行硬编码10秒钟,以便给我足够的时间来附加调试器。这是有效的,但很烦人,因为我需要重新编译一次以暂停,当我(希望记得)暂停时。我知道我可以硬编码中断命令,但这也需要我重新编译我的解决方案。

我知道我也可以将我的服务逻辑分成一个可以在Visual Studio中运行的单独项目,我可以在大多数时间使用它,但有时我想看看我的服务在运行时的确切行为服务。

有没有办法让我的调试器附加到我的服务上,以便我可以看到它在启动时所做的事情,而无需硬编码和重新编译任何东西?

3 个答案:

答案 0 :(得分:2)

有一个注册表项,使您有机会在创建过程后立即将调试器附加到该过程。

将以下代码段保存为* .reg文件并导入您的注册表:

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\services.exe]
"Debugger"="c:\\Program Files\\Debugging Tool For Windows\\windbg.exe"

记得将'services.exe'更改为实际的服务可执行文件名。

您还可以使用gflag工具来促进工作。有关详细信息,请查看KB 824344: How to debug Windows services

答案 1 :(得分:0)

在Visual Studio的“工具”菜单上查看“附加到进程”。您可以在代码中放置一个断点,然后启动该过程并调试该服务。你可能必须放一个thread.sleep()来给你足够的时间来做出反应。

您必须启动该服务,而不是在Visual Studio中附加到该进程。 thread.sleep()将为您提供执行附加的时间,而不会受到启动代码的影响。

答案 2 :(得分:0)

以下是Microsoft关于如何完成此操作的建议:http://msdn.microsoft.com/en-us/library/7a50syb3%28VS.80%29.aspx