无法附加Windows服务进程

时间:2009-08-28 02:40:28

标签: visual-studio-2008 debugging windows-services

我有一个非常简单的Windows服务,它是在vb.net 2008中开发的。当我尝试通过工具调试它时 - >附加到流程虽然我看到我的服务被禁用,管理类型和我无法选择流程。

如何调试我的服务?

由于

5 个答案:

答案 0 :(得分:15)

如果您遵循MSDN中的基本Windows服务创建“教程”,您将遇到此问题。您将在“附加到进程”对话框中看到MyNewService.vshost.exe,但它将被禁用。要查看您的服务,您必须同时检查“显示所有用户的进程”和“在所有会话中显示进程”以查看您的服务。如果您按照教程中的说明操作,则服务在“SYSTEM”用户名下运行,并且服务通常在不同的会话中运行。

检查这两个框(并忽略MyNewService.vshost.exe)后,您将看到My​​NewService.exe,您可以选择并调试它。

当然,在服务遇到断点之前不会发生任何事情。您可以创建OnPause(如OnContinue)处理程序,但为了能够暂停您的服务,您需要在服务上设置CanPauseAndContinue标志(与AutoLog标志相同的对象)。

另外,在我对64位机器的测试中,仅重新编译项目不允许成功调试。即使编译和重新安装也无效。我不得不重新编译项目,然后重新编译安装项目,然后重新安装设置以便能够调试服务。

最后,可以通过“控制面板”中“管理工具”下的“事件查看器”查看事件日志。当按照MSDN教程中的描述创建时,“MyNewLog”位于“应用程序和服务日志”下。

答案 1 :(得分:10)

附加到服务工作,所以我不确定为什么你不能。取而代之的是,在Windows服务(或OnStart()方法)的应用程序入口点插入以下行,在调试模式下编译,然后启动服务。

System.Diagnostics.Debugger.Break();

启动服务时,系统将提示您调试该过程。选择Visual Studio 2008调试器,该进程将加载并停止在您的程序断点处。点击F5再次开始运行。

编辑:

假设您已构建服务(发布模式或调试模式 - 无关紧要)并使用installutil来安装服务,但您还没有启动它。只要服务 运行,您就可以继续进行代码更改并重新编译。当您启动该服务时,您的服务将反映您最新的代码更改。如果服务 正在运行,您将无法完全编译服务,因为exe / dll正在使用中且无法替换。显然,只需停止服务,重新编译,然后重新启动服务。重点是: 您无需卸载服务即可修改代码。 只需停止它,更改代码,重新编译并重新启动

至于调试与发布模式的调试,我不知道这是不是你无法附加到进程的原因。我知道可以调试发行版本,但我不建议这只是因为如果启用了优化,您可能会遇到遍历代码的问题。我们只使用发布模式调试作为最后的手段。

默认情况下,在调试模式下构建Visual Studio应用程序时,它将放在项目的bin \ Debug子目录中。在发布模式下构建时,可执行文件将放在bin \ Release子目录中。当您使用installutil安装服务时,唯一重要的是服务所在的位置。在您的情况下,我建议您卸载服务的发布模式版本(installutil /u c:\myapp\myapp\bin\release\myapp.exe),将程序断点放入,构建调试版本,然后使用installutil安装调试版本(从bin中) \ Debug目录)。

对不起,这是啰嗦。我希望这很清楚。

答案 2 :(得分:3)

您确定要查看实际的服务流程吗?检查服务名称 - 它是否类似于servicename.vshost.exe?如果是这样,那么这不是你的服务,而是用于F5调试的视觉工作室托管过程(除其他外)。

要调试您的服务,请选中“显示所有用户的进程”复选框。您应该在进程列表中看到实际的服务进程servicename.exe。如果它是可见的,那么只需附加到该过程。

答案 3 :(得分:1)

我不仅需要选中show processes from all usersshow processes in all sessions复选框;我还必须点击Select按钮,然后选择Managed代码。

enter image description here

答案 4 :(得分:0)

服务只不过是一个控制台应用程序,因此只要在调试模式下编译,就可以从命令行运行exe。从命令行运行该进程后,您将转到Debug =>附加到visual studio中的进程并附加到刚从命令行启动的exe。您也可以使用F5直接在Visual Studio IDE中运行。

如果您的服务在特殊用户帐户下运行,则需要使用runas / user命令在Visual Studio中进行调试时启动visual studio,如果从命令行运行它,则需要从命令行启动

如果这不起作用....请告诉我。

最诚挚的问候, 迈克尔