【问题标题】:Not able to attach windows Service process无法附加 Windows 服务进程
【发布时间】:2009-08-28 02:40:28
【问题描述】:

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

如何调试我的服务?

谢谢

【问题讨论】:

  • 我已根据您的问题更新了我的回复。

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


【解决方案1】:

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

选中这两个框后(并忽略 MyNewService.vshost.exe),您将看到 MyNewService.exe,您可以选择和调试它。

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

另外,在我的 64 位机器上进行测试时,仅仅重新编译项目并不能成功调试。即使编译和重新安装也不起作用。我必须重新编译项目,然后重新编译设置项目,然后重新安装设置才能调试服务。

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

【讨论】:

  • “一旦你选中这两个框(并忽略 MyNewService.vshost.exe),你就会看到 MyNewService.exe”——真的救了我的命!
【解决方案2】:

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

System.Diagnostics.Debugger.Break();

当你启动服务时,会提示你调试进程。选择 Visual Studio 2008 调试器,该进程将加载并在您的程序断点处停止。按 F5 重新开始运行。

编辑:

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

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

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

抱歉,这有点啰嗦。我希望这很清楚。

【讨论】:

  • 谢谢马特。我有一个问题。这就是我所做的。我在发布模式下构建应用程序。去安装 util 并使用 installutil c:\myapp\myapp\bin\release\myapp.exe 之类的东西安装它你的意思是我应该在调试模式下构建它然后使用 installutil c:\myapp\myapp\bin\debug \myapp.exe 然后尝试附加到进程?
  • 是的,您应该在调试模式下构建并从 bin\debug 文件夹安装。
【解决方案3】:

您确定您正在查看您的实际服务流程吗?检查服务名称——它是否类似于 servicename.vshost.exe?如果是这样,那么这不是您的服务,而是用于 F5 调试(除其他外)的 Visual Studio 托管进程。

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

【讨论】:

  • 是的 Tuzo 我只看到 servicename.vshost.exe 而不是 vshost.exe。你认为问题出在哪里
  • 忽略任何带有 vshost.exe 的进程,因为您无法调试它们。您是否检查了“显示所有用户的进程”?如果你这样做了,你应该看到你的服务进程为 servicename.exe。如果你在那里没有看到它,那么它可能意味着你的服务没有启动。尝试启动服务。
【解决方案4】:

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

【讨论】:

    【解决方案5】:

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

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

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

    最好的问候, 迈克尔

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-14
      • 2014-08-03
      • 2017-12-23
      • 2019-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多