【发布时间】:2009-08-28 02:40:28
【问题描述】:
我有一个非常简单的 Windows 服务,它是在 vb.net 2008 中开发的。当我尝试通过工具-> 附加到进程来调试它时,虽然我看到我的服务被禁用并且托管类型并且我无法选择过程。
如何调试我的服务?
谢谢
【问题讨论】:
-
我已根据您的问题更新了我的回复。
标签: visual-studio-2008 debugging windows-services
我有一个非常简单的 Windows 服务,它是在 vb.net 2008 中开发的。当我尝试通过工具-> 附加到进程来调试它时,虽然我看到我的服务被禁用并且托管类型并且我无法选择过程。
如何调试我的服务?
谢谢
【问题讨论】:
标签: visual-studio-2008 debugging windows-services
如果您按照 MSDN 中的基本 Windows 服务创建“教程”进行操作,您将遇到此问题。您将在“附加到进程”对话框中看到 MyNewService.vshost.exe,但它将被禁用。要查看您的服务,您必须同时选中“显示所有用户的进程”和“显示所有会话中的进程”才能查看您的服务。如果您按照教程中的说明操作,该服务将在“SYSTEM”用户名下运行,并且服务通常在不同的会话中运行。
选中这两个框后(并忽略 MyNewService.vshost.exe),您将看到 MyNewService.exe,您可以选择和调试它。
当然,在服务遇到断点之前什么都不会发生。您可以创建 OnPause(如 OnContinue)处理程序,但为了能够暂停您的服务,您需要在您的服务上设置 CanPauseAndContinue 标志(与 AutoLog 标志相同的对象)。
另外,在我的 64 位机器上进行测试时,仅仅重新编译项目并不能成功调试。即使编译和重新安装也不起作用。我必须重新编译项目,然后重新编译设置项目,然后重新安装设置才能调试服务。
最后,可以通过控制面板中管理工具下的事件查看器查看事件日志。当按照 MSDN 教程中的描述创建时,“MyNewLog”位于应用程序和服务日志下。
【讨论】:
附加到服务应该工作,所以我不知道为什么你不能。取而代之的是,在您的 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目录)。
抱歉,这有点啰嗦。我希望这很清楚。
【讨论】:
您确定您正在查看您的实际服务流程吗?检查服务名称——它是否类似于 servicename.vshost.exe?如果是这样,那么这不是您的服务,而是用于 F5 调试(除其他外)的 Visual Studio 托管进程。
要调试您的服务,请选中“显示所有用户的进程”复选框。您应该在进程列表中看到实际的服务进程 servicename.exe。如果它是可见的,那么只需附加到该进程。
【讨论】:
我不仅必须选择show processes from all users 和show processes in all sessions 复选框;我还必须单击Select 按钮,然后选择Managed 代码。
【讨论】:
服务只不过是一个控制台应用程序,因此只要它是在调试模式下编译的,您就应该能够从命令行运行该 exe。一旦进程从命令行运行,您将转到 Debug => attach to process in Visual Studio 并附加到您刚刚从命令行启动的 exe。您也可以使用 F5 直接在 Visual Studio IDE 中运行。
如果您的服务在特殊用户帐户下运行,如果您在 Visual Studio 中调试,则需要使用 runas /user 命令启动 Visual Studio;如果您从命令行运行,则需要从命令行启动.
如果这不起作用......请告诉我。
最好的问候, 迈克尔
【讨论】: