本文分步介绍了如何调试 Windows 服务使用 WinDbg 调试器 (windbg.exe)。 若要调试 Windows 服务,您可以将 WinDbg 调试器附加到服务启动之后, 承载服务的进程,或可以配置服务能够启动与在 WinDbg 调试器附加以便即可解决服务启动相关的问题。 本文介绍了这两种方法。
要求
<script type="text/javascript"></script> 本文假定您熟悉下列主题:
- Windows 服务
- WinDbg 调试器
在服务启动后,将 WinDbg 调试程序附加到服务
<script type="text/javascript"></script> 此方法非常类似于可用于将调试程序附加到进程和然后调试进程的方法。
使用托管服务要调试的进程的进程 ID
<script type="text/javascript"></script>
- 若要确定进程 ID (PID) 承载您要调试的服务的进程的请使用下列方法之一。
-
方法 1: 使用任务管理器
<script type="text/javascript"></script>- 右键单击该的任务栏,然后单击 任务管理器 。 Windows 任务管理器 对话框。
- 单击 Windows 任务管理器 对话框的 进程 选项卡。
- 在 映像名称 ,下单击承载您要调试的服务的进程的映像名称。 请注意此过程由相应的 PID 字段的值指定的进程 ID。
-
方法 2: 使用任务列表实用工具 (Tlist.exe)
<script type="text/javascript"></script>- 单击 开始 ,然后单击 运行 。 出现 运行 对话框。
- 在 打开 的框中键入 cmd ,然后单击 确定 。
- 在命令提示符更改目录路径以反映 Tlist.exe 文件在您的计算机上的位置。
请注意 Tlist.exe 文件通常位于以下目录: C:/Program Files /Debugging Tools for Windows - 在命令提示符下,键入 tlist 列出图像名称和进程的当前正在您的计算机运行的所有进程的 ID。
请注意 记下承载您要调试的服务的进程的进程 ID。
-
- 在命令提示符下更改目录路径以反映 windbg.exe 文件在您的计算机上的位置。
请注意 如果命令提示符下不打开,请按照下列步骤在和 b 的方法 1。 windbg.exe 文件通常位于以下目录: C:/Program Files /Debugging Tools for Windows。 - 在命令提示符下,键入 windbg –p ProcessID / g 将 WinDbg 调试器附加到承载服务要调试的进程。
请注意 ProcessID 是进程的一个占位符承载您要调试的服务的进程 ID。
使用承载您要调试的服务的进程的映像名称
<script type="text/javascript"></script> 可以使用此方法仅当承载您要运行的服务的进程的一个正在运行的实例。 要这样做,请按下列步骤操作:
- 单击 开始 ,然后单击 运行 。 出现 运行 对话框。
- 在 打开 框键入 cmd ,然后单击 确定 以打开命令提示符。
- 在命令提示符更改目录路径以反映 windbg.exe 文件在您的计算机上的位置。
请注意 windbg.exe 文件通常位于以下目录: C:/Program Files /Debugging Tools for Windows。 - 在命令提示符下,键入 windbg –pn ImageName / g 将 WinDbg 调试器附加到承载服务要调试的进程。
请注意 ImageName 是进程的承载您要调试的服务的映像名称占位符。 在"-pn"命令行选项指定 ImageName 命令行参数是一个进程的图像名称。
启动 WinDbg 调试器,并附加到承载您要调试的服务的进程
<script type="text/javascript"></script>
- 启动 Windows 资源管理器。
- 找到您的计算机上 windbg.exe 文件。
请注意 windbg.exe 文件通常位于以下目录: C:/Program Files /Debugging Tools for Windows - 运行 windbg.exe 文件一起使用 / g 命令行开关启动在 WinDbg 调试器。 / g 命令行开关允许跟踪的进程继续设置中断点后。
- 在 文件 菜单中上, 单击显示 附加到进程 对话框的 附加到进程 。
- 单击以选中对应于进程承载您要调试,服务的节点,然后单击 确定 。
- 在出现的对话框中,单击 是 以保存基工作区信息。 请注意您可以现在调试您的服务的 disassembled 的代码。
配置服务启动,WinDbg 附加调试程序
<script type="text/javascript"></script> 可以使用此方法来调试服务,如果要解决服务启动相关的问题。
- 配置"图像文件执行"选项。 为此,请使用下列方法之一:
-
方法 1: 使用全局标志编辑器 (Gflags.exe)
<script type="text/javascript"></script>- 启动 Windows 资源管理器。
- 找到您的计算机上 Gflags.exe 文件。
请注意 Gflags.exe 文件通常位于以下目录: C:/Program Files /Debugging Tools for Windows。 - 运行 Gflags.exe 文件以启动全局标志编辑器。
- 在 图像文件名称 文本框中,键入承载您要调试的服务的进程的映像名称。 是例如如果您要调试由具有 MyService.exe 作为图像名称的进程承载的服务,键入 MyService.exe 。
- 目标 下, 单击以选择 图像文件选项 选项。
- 图像调试器选项 ,下单击以选中 调试器 复选框。
- 调试器 文本框中键入您要使用的调试器的完整路径。 是例如如果您要使用 WinDbg 调试器调试服务,您可以键入类似于以下内容的完整路径: C:/Program Files /Debugging Tools,for Windows/windbg.exe
- 单击 应用 ,然后单击 确定 以退出全局标记编辑器。
-
方法 2: 使用注册表编辑器
<script type="text/javascript"></script>- 单击 开始 ,然后单击 运行 。 出现 运行 对话框。
- 在 打开 的框中键入 regedit ,然后单击 确定 以启动注册表编辑器。
- 重要 此部分、 方法,或任务包含告诉您如何修改注册表的步骤。 但是,如果错误地修改注册表,就可能发生严重的问题。 因此,请确保认真执行这些步骤。 添加的保护注册表之前先备份您修改它。 然后,发生问题时可以还原注册表。 有关如何备份和还原在注册表的详细信息,单击下面的文章编号,以查看 Microsoft 知识库中相应:
322756 (http://support.microsoft.com/kb/322756/ ) 如何备份和还原在 Windows 注册表
在注册表编辑器中,查找,然后右键单击下的注册表子项:HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/Image File Execution Options - 指向 新建 ,然后单击 键 。 在注册表编辑器在左窗格,会注意到 新项 # 1 (新的注册表子项的名称) 中选择进行编辑。
- 键入 ImageName 替换 新项 # 1 ,然后按 Enter 键。
请注意 ImageName 是进程的承载您要调试的服务的映像名称占位符。 是例如如果您要调试由具有 MyService.exe 作为图像名称的进程承载的服务,键入 MyService.exe 。 - 用鼠标右键单击在步骤 e 中创建注册表子项。
- 指向 新建 ,然后单击 字符串值 。 在注册表编辑器在右窗格,会注意到 新值 # 1 ,一个新的注册表项的名称选择进行编辑。
- 使用 调试器 ,替换 新值 # 1 ,,然后按 ENTER 键。
- 右键单击您在步骤 h, 调试程序 注册表项,然后单击 修改 。 编辑字符串 对话框。
- 在该 数值数据 文字框键入 DebuggerPath,然后单击 确定 。
请注意 DebuggerPath 是调试器的完整路径,您要使用的占位符。 是例如如果您要使用 WinDbg 调试器调试服务,您可以键入类似于以下的完整路径:C:/Progra~1/Debugg~1/windbg.exe
-
- 调试程序窗口会出现在您的桌面上并与调试程序交互,使您的服务交互。 如果您没有进行您服务交互,调试程序将启动您无法看到该但不能发出命令。 要使您服务交互,请使用下列方法之一:
-
方法 1: 使用服务控制台
<script type="text/javascript"></script>- 单击 开始 ,然后指向 程序 。
- 在 程序 菜单上指向 管理工具 ,然后单击 服务 。 将出现 服务 控制台。
- 在 服务 的右窗格中控制台右键单击 ServiceName,单击 属性 。
请注意 ServiceName 是一个占位符要调试服务的名称。 - 在 登录 选项卡上,请单击以选中 允许服务与桌面交互 复选框在 本地系统帐户 下,,然后单击 确定 。
-
方法 2: 使用注册表编辑器
<script type="text/javascript"></script>- 在注册表编辑器找到,并单击以下注册表子项:
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/ServiceName请注意 ServiceName 替换为要调试的服务的名称。 是例如如果要调试服务名为 MyService,找到,并单击下面的注册表项:HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/MyService
- 在注册表编辑器的右窗格中, 名称 字段的下方 类型 ,右键单击,然后单击 修改 。 编辑 DWORD 值 对话框。
- 更改 数值数据 中的文本的当前文本和二进制的值 0x00000100,为两个操作数文本框二进制或运算的结果,使用二进制值。 二进制的值,0x00000100,对应于计算机上的 WinNT.h 标头文件中定义的 SERVICE_INTERACTIVE_PROCESS 常量。 该常量指定服务是交互式在本质上。
- 在注册表编辑器找到,并单击以下注册表子项:
-
- 服务启动时, 该服务通信到服务控制管理器多长时间服务必须启动 (服务的超时时间)。 如果服务控制管理器没有收到"服务已启动"通知服务此超时期限内,服务控制管理器会终止承载服务的进程。 此超时期限通常是小于 30 秒。 如果不要调整此超时时间,服务控制管理器结束进程并附加的调试器时要尝试进行调试。 要调整此超时时间,请按下列步骤操作:
- 在注册表编辑器中,查找,然后右键单击下的注册表子项:
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control
- 指向 新建 ,然后单击 DWORD 值 。 在注册表编辑器在右窗格,会注意到 新值 # 1 (新的注册表项的名称) 中选择进行编辑。
- 键入 ServicesPipeTimeout 替换 新值 # 1 ,然后按 Enter 键。
- 右键单击 ServicesPipeTimeout 注册表项,您在步骤 c,然后单击 修改 。 编辑 DWORD 值 对话框。
- 在该 数值数据 文字框键入 TimeoutPeriod,,,然后单击 确定
请注意 TimeoutPeriod 是一个占位符超时时间 (以毫秒计) 要为服务设置的值。 是例如如果您要将超时时间段设置为 24 小时 (86400000 毫秒),键入 86400000 。 - 重新启动计算机。 必须重新启动计算机的服务控制管理器若要将此更改应用。
- 在注册表编辑器中,查找,然后右键单击下的注册表子项:
- 启动您的 Windows 服务。 要这样做,请按下列步骤操作:
- 单击 开始 ,然后指向 程序 。
- 在 程序 菜单上指向 管理工具 ,然后单击 服务 。 将出现 服务 控制台。
- 在 服务 的右窗格中控制台右键单击 ServiceName,单击 开始 。
请注意 ServiceName 是一个占位符要调试服务的名称。
疑难解答
<script type="text/javascript"></script> 在您尝试通过网络调试服务之前,请确保符号和服务使用的源文件可以从将运行服务的计算机访问。 为此,请使用下列方法之一:
- 至少读访问权限授予 Everyone 文件夹在包含符号和源代码文件服务使用的计算机上。
- 将这些符号和服务使用的源文件复制到将运行服务的计算机中。