将Visual Studio调试器附加到Windows服务--“附加”灰色

41

我正在尝试使用 Visual Studio 2010 → 调试附加到进程 命令连接到一个 Windows 服务。当我滚动查看进程列表时,我的 Windows 服务是灰色的,附加按钮也是灰色的。

我尝试将服务账户更改为本地服务、我的账户等,但它仍然是灰色的。有没有办法解决这个问题?


可能是因为服务处于发布模式吗? - pdiddy
好的想法,但我已经检查过它是否处于调试模式了。 - Kevin McPhail
9个回答

64

我通常也遇到同样的问题,我的解决方法是在配置中添加一个布尔值以触发调试启动。您可以通过调用以下方法启动一个附加到Windows服务进程的Visual Studio调试器实例:

System.Diagnostics.Debugger.Launch();

很好的一点是你可以在代码中任何你希望的地方调用它。


1
我喜欢这个。这是一种很好的简单方法,可以从服务中启动调试器。下一个问题是,如果该服务安装在另一台机器上,是否有一种远程附加的方法? - Kevin McPhail
暂时没有答案,但这对我也有好处。我会看看是否有简单的方法来实现它,如果有的话,我会编辑我的答案,包括那个解决方案。 - Jeff LaFay

39

在Visual Studio 2010中,在“附加到进程”对话框中,勾选底部两个复选框,分别为“显示所有用户的进程”和“显示所有会话中的进程”。

这样做后,我发现我的进程出现了两次,一个是以系统身份运行的进程,另一个则是在我本地Windows登录下运行的。我不确定为什么会这样(如果有任何意见,请告知!),但我能够附加到显示出来的未灰掉的那个进程,并通过这种方式逐步执行我的代码。

第二个进程是如Ozz在评论中指出的servicename.vshost.exe进程。

如果您仍然看不到它,请确保您的服务仍在运行。有时候您可能会遇到启动并自动停止的失败服务,因此它不会在“附加到进程”选项中显示出来。


4
这个对我有用。我注意到的是,“灰色”的那个实际上是我的myservice.vshost.exe进程,但由于名称很长且结尾被列隐藏了,所以我没有注意到。按照 PreethA 的说明出现的那个是真正要连接的进程。我猜想 PreethA 看到的两个进程中的一个是他自己的myservice.vshost.exe。 - ozz
在我的情况下,我不得不勾选“显示所有会话中的所有进程”复选框。由于某种原因,在这样做之后,它不再是灰色的了。 - Flea

8
我不仅需要选择“显示所有用户的进程”和“显示所有会话中的进程”复选框;我还需要单击“选择”按钮,然后选择“管理”的代码。
图片链接:https://istack.dev59.com/NcrJt.webp

2
安装Windows服务后,启动该服务。然后在Visual Studio中打开“附加到进程”窗口(Alt+Ctrl+P),找到您要的进程并选择它,然后单击窗口底部的“附加按钮”。

这篇文章不应该被踩,它正是微软建议的做法:https://learn.microsoft.com/en-us/dotnet/framework/windows-services/how-to-debug-windows-service-applications - Worthy7
另外,我加了 Thread.Sleep(25000) 来延迟执行,并给我足够的时间来附加到进程。当然,我使用调试模式构建,并将 exe 和 pdb 文件复制粘贴到部署文件夹中。 - ronilk

2

请确保您以管理员身份运行Visual Studio。它需要管理员权限才能附加到正在运行的服务。


尝试过这个,但没有成功。我可以连接到进程列表中列出的其他服务,只是不能连接到我需要的那个。 :) - Kevin McPhail

0

我通过将设置生成方式从RELEASE更改为DEBUG来解决了我的问题。然后,我像往常一样安装了服务并进行了附加。


0

您可能没有附加到服务的权限。您在桌面上是否具有管理员特权?许多公司默认情况下不允许此操作,据说是为了帮助保护其环境。


对,我有管理员权限,我尝试右键单击并以管理员身份运行 VS,看看是否有帮助。但是没有成功。 - Kevin McPhail
你是否有尝试这里描述的备用调试策略的机会:http://msdn.microsoft.com/en-us/library/7a50syb3(VS.80).aspx? - Steve Townsend
Steve,谢谢你提供的链接。我之前看过那个页面,但没有注意到底部的备选策略。之前我用控制台测试过服务,这是一个相当不错的替代方案。 - Kevin McPhail
欢迎。我很想知道这个问题对你来说是如何解决的。 - Steve Townsend

-1
今天我遇到了同样的问题,之前的解决方案都没有起作用。结果发现,如果你有一个ProcDump会话监控该进程,是不可能附加到该进程的。

-2

使用菜单 工具附加到进程。只需在左下角勾选显示所有用户的进程。按进程排序,尝试查找您的Windows服务。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接