Help and Support

文章编号: 824344 - 最后修改: 2007年5月16日 - 修订: 6.5

如何调试 Windows 服务

本页

展开全部 | 关闭全部

概要

本文分步介绍了如何调试 Windows 服务使用 WinDbg 调试器 (windbg.exe)。 若要调试 Windows 服务,您可以将 WinDbg 调试器附加到服务启动之后, 承载服务的进程,或可以配置服务能够启动与在 WinDbg 调试器附加以便即可解决服务启动相关的问题。 本文介绍了这两种方法。

要求

本文假定您熟悉下列主题:
  • Windows 服务
  • WinDbg 调试器

在服务启动后,将 WinDbg 调试程序附加到服务

此方法非常类似于可用于将调试程序附加到进程和然后调试进程的方法。

使用托管服务要调试的进程的进程 ID

  1. 若要确定进程 ID (PID) 承载您要调试的服务的进程的请使用下列方法之一。
    • 方法 1: 使用任务管理器
      1. 右键单击该的任务栏,然后单击 任务管理器 Windows 任务管理器 对话框。
      2. 单击 Windows 任务管理器 对话框的 进程 选项卡。
      3. 映像名称 ,下单击承载您要调试的服务的进程的映像名称。 请注意此过程由相应的 PID 字段的值指定的进程 ID。
    • 方法 2: 使用任务列表实用工具 (Tlist.exe)
      1. 单击 开始 ,然后单击 运行 。 出现 运行 对话框。
      2. 打开 的框中键入 cmd ,然后单击 确定
      3. 在命令提示符更改目录路径以反映 Tlist.exe 文件在您的计算机上的位置。

        请注意 Tlist.exe 文件通常位于以下目录: C:\Program Files \Debugging Tools for Windows
      4. 在命令提示符下,键入 tlist 列出图像名称和进程的当前正在您的计算机运行的所有进程的 ID。

        请注意 记下承载您要调试的服务的进程的进程 ID。
  2. 在命令提示符下更改目录路径以反映 windbg.exe 文件在您的计算机上的位置。

    请注意 如果命令提示符下不打开,请按照下列步骤在和 b 的方法 1。 windbg.exe 文件通常位于以下目录: C:\Program Files \Debugging Tools for Windows。
  3. 在命令提示符下,键入 windbg –p ProcessID / g 将 WinDbg 调试器附加到承载服务要调试的进程。

    请注意 ProcessID 是进程的一个占位符承载您要调试的服务的进程 ID。

使用承载您要调试的服务的进程的映像名称

可以使用此方法仅当承载您要运行的服务的进程的一个正在运行的实例。 要这样做,请按下列步骤操作:
  1. 单击 开始 ,然后单击 运行 。 出现 运行 对话框。
  2. 打开 框键入 cmd ,然后单击 确定 以打开命令提示符。
  3. 在命令提示符更改目录路径以反映 windbg.exe 文件在您的计算机上的位置。

    请注意 windbg.exe 文件通常位于以下目录: C:\Program Files \Debugging Tools for Windows。
  4. 在命令提示符下,键入 windbg –pn ImageName / g 将 WinDbg 调试器附加到承载服务要调试的进程。

    请注意 ImageName 是进程的承载您要调试的服务的映像名称占位符。 在"-pn"命令行选项指定 ImageName 命令行参数是一个进程的图像名称。

启动 WinDbg 调试器,并附加到承载您要调试的服务的进程

  1. 启动 Windows 资源管理器。
  2. 找到您的计算机上 windbg.exe 文件。

    请注意 windbg.exe 文件通常位于以下目录: C:\Program Files \Debugging Tools for Windows
  3. 运行 windbg.exe 文件一起使用 / g 命令行开关启动在 WinDbg 调试器。 / g 命令行开关允许跟踪的进程继续设置中断点后。
  4. 文件 菜单中上, 单击显示 附加到进程 对话框的 附加到进程
  5. 单击以选中对应于进程承载您要调试,服务的节点,然后单击 确定
  6. 在出现的对话框中,单击 以保存基工作区信息。 请注意您可以现在调试您的服务的 disassembled 的代码。

配置服务启动,WinDbg 附加调试程序

可以使用此方法来调试服务,如果要解决服务启动相关的问题。
  1. 配置"图像文件执行"选项。 为此,请使用下列方法之一:
    • 方法 1: 使用全局标志编辑器 (Gflags.exe)
      1. 启动 Windows 资源管理器。
      2. 找到您的计算机上 Gflags.exe 文件。

        请注意 Gflags.exe 文件通常位于以下目录: C:\Program Files \Debugging Tools for Windows。
      3. 运行 Gflags.exe 文件以启动全局标志编辑器。
      4. 图像文件名称 文本框中,键入承载您要调试的服务的进程的映像名称。 是例如如果您要调试由具有 MyService.exe 作为图像名称的进程承载的服务,键入 MyService.exe
      5. 目标 下, 单击以选择 图像文件选项 选项。
      6. 图像调试器选项 ,下单击以选中 调试器 复选框。
      7. 调试器 文本框中键入您要使用的调试器的完整路径。 是例如如果您要使用 WinDbg 调试器调试服务,您可以键入类似于以下内容的完整路径: C:\Program Files \Debugging Tools,for Windows\windbg.exe
      8. 单击 应用 ,然后单击 确定 以退出全局标记编辑器。
    • 方法 2: 使用注册表编辑器
      1. 单击 开始 ,然后单击 运行 。 出现 运行 对话框。
      2. 打开 的框中键入 regedit ,然后单击 确定 以启动注册表编辑器。
      3. 重要 此部分、 方法,或任务包含告诉您如何修改注册表的步骤。 但是,如果错误地修改注册表,就可能发生严重的问题。 因此,请确保认真执行这些步骤。 添加的保护注册表之前先备份您修改它。 然后,发生问题时可以还原注册表。 有关如何备份和还原在注册表的详细信息,单击下面的文章编号,以查看 Microsoft 知识库中相应:
        322756? (http://support.microsoft.com/kb/322756/ ) 如何备份和还原在 Windows 注册表


        在注册表编辑器中,查找,然后右键单击下的注册表子项:
        HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options
      4. 指向 新建 ,然后单击 。 在注册表编辑器在左窗格,会注意到 新项 # 1 (新的注册表子项的名称) 中选择进行编辑。
      5. 键入 ImageName 替换 新项 # 1 ,然后按 Enter 键。

        请注意 ImageName 是进程的承载您要调试的服务的映像名称占位符。 是例如如果您要调试由具有 MyService.exe 作为图像名称的进程承载的服务,键入 MyService.exe
      6. 用鼠标右键单击在步骤 e 中创建注册表子项。
      7. 指向 新建 ,然后单击 字符串值 。 在注册表编辑器在右窗格,会注意到 新值 # 1 ,一个新的注册表项的名称选择进行编辑。
      8. 使用 调试器 ,替换 新值 # 1 ,,然后按 ENTER 键。
      9. 右键单击您在步骤 h, 调试程序 注册表项,然后单击 修改 编辑字符串 对话框。
      10. 在该 数值数据 文字框键入 DebuggerPath,然后单击 确定

        请注意 DebuggerPath 是调试器的完整路径,您要使用的占位符。 是例如如果您要使用 WinDbg 调试器调试服务,您可以键入类似于以下的完整路径:
        C:\Progra~1\Debugg~1\windbg.exe
  2. 调试程序窗口会出现在您的桌面上并与调试程序交互,使您的服务交互。 如果您没有进行您服务交互,调试程序将启动您无法看到该但不能发出命令。 要使您服务交互,请使用下列方法之一:
    • 方法 1: 使用服务控制台
      1. 单击 开始 ,然后指向 程序
      2. 程序 菜单上指向 管理工具 ,然后单击 服务 。 将出现 服务 控制台。
      3. 服务 的右窗格中控制台右键单击 ServiceName,单击 属性

        请注意 ServiceName 是一个占位符要调试服务的名称。
      4. 登录 选项卡上,请单击以选中 允许服务与桌面交互 复选框在 本地系统帐户 下,,然后单击 确定
    • 方法 2: 使用注册表编辑器
      1. 在注册表编辑器找到,并单击以下注册表子项:
        HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ServiceName
        请注意 ServiceName 替换为要调试的服务的名称。 是例如如果要调试服务名为 MyService,找到,并单击下面的注册表项:
        HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MyService
      2. 在注册表编辑器的右窗格中, 名称 字段的下方 类型 ,右键单击,然后单击 修改 编辑 DWORD 值 对话框。
      3. 更改 数值数据 中的文本的当前文本和二进制的值 0x00000100,为两个操作数文本框二进制或运算的结果,使用二进制值。 二进制的值,0x00000100,对应于计算机上的 WinNT.h 标头文件中定义的 SERVICE_INTERACTIVE_PROCESS 常量。 该常量指定服务是交互式在本质上。
  3. 服务启动时, 该服务通信到服务控制管理器多长时间服务必须启动 (服务的超时时间)。 如果服务控制管理器没有收到"服务已启动"通知服务此超时期限内,服务控制管理器会终止承载服务的进程。 此超时期限通常是小于 30 秒。 如果不要调整此超时时间,服务控制管理器结束进程并附加的调试器时要尝试进行调试。 要调整此超时时间,请按下列步骤操作:
    1. 在注册表编辑器中,查找,然后右键单击下的注册表子项:
      HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control
    2. 指向 新建 ,然后单击 DWORD 值 。 在注册表编辑器在右窗格,会注意到 新值 # 1 (新的注册表项的名称) 中选择进行编辑。
    3. 键入 ServicesPipeTimeout 替换 新值 # 1 ,然后按 Enter 键。
    4. 右键单击 ServicesPipeTimeout 注册表项,您在步骤 c,然后单击 修改 编辑 DWORD 值 对话框。
    5. 在该 数值数据 文字框键入 TimeoutPeriod,,,然后单击 确定

      请注意 TimeoutPeriod 是一个占位符超时时间 (以毫秒计) 要为服务设置的值。 是例如如果您要将超时时间段设置为 24 小时 (86400000 毫秒),键入 86400000
    6. 重新启动计算机。 必须重新启动计算机的服务控制管理器若要将此更改应用。
  4. 启动您的 Windows 服务。 要这样做,请按下列步骤操作:
    1. 单击 开始 ,然后指向 程序
    2. 程序 菜单上指向 管理工具 ,然后单击 服务 。 将出现 服务 控制台。
    3. 服务 的右窗格中控制台右键单击 ServiceName,单击 开始

      请注意 ServiceName 是一个占位符要调试服务的名称。

疑难解答

在您尝试通过网络调试服务之前,请确保符号和服务使用的源文件可以从将运行服务的计算机访问。 为此,请使用下列方法之一:
  • 至少读访问权限授予 Everyone 文件夹在包含符号和源代码文件服务使用的计算机上。
  • 将这些符号和服务使用的源文件复制到将运行服务的计算机中。

参考

下载工具和本文中提到的实用工具,请访问下面的 Microsoft 网站:
Debugging Tools for Windows: 概述
http://www.microsoft.com/whdc/devtools/debugging/default.mspx (http://www.microsoft.com/whdc/devtools/debugging/default.mspx)
更多的信息,请访问下面的 Microsoft 开发 Network (MSDN) Web 站点:
WinDbg 调试器
http://www.microsoft.com/whdc/devtools/debugging/installx86.mspx (http://www.microsoft.com/whdc/devtools/debugging/installx86.mspx)
服务
http://msdn2.microsoft.com/en-us/library/ms685141.aspx (http://msdn2.microsoft.com/en-us/library/ms685141.aspx)
使用全局标志实用工具
http://msdn2.microsoft.com/en-us/library/ms792858.aspx (http://msdn2.microsoft.com/en-us/library/ms792858.aspx)

这篇文章中的信息适用于:
  • Microsoft Windows 2000 Server
  • Microsoft Windows 2000 Advanced Server
  • Microsoft Windows 2000 Datacenter Server
  • Microsoft Windows 2000 Professional Edition
  • Microsoft Windows Server 2003 Enterprise Edition
  • Microsoft Windows Server 2003 Standard Edition
  • Microsoft Windows Server 2003 Datacenter Edition
  • Microsoft Windows XP Home Edition
  • Microsoft Windows XP Home Edition SP1
  • Microsoft Windows XP Professional Edition
关键字:?
kbmt kbimghlp kbregistry kbservice kbdebug kbmisctools kbhowtomaster KB824344 KbMtzh
机器翻译机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。如果您发现了错误并希望帮助我们提高机器翻译技术,请完成文章末尾的在线调查。
点击这里察看该文章的英文版: 824344? (http://support.microsoft.com/kb/824344/en-us/ )
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

文章翻译