本文分步介绍了如何调试 Windows 服务通过使用 WinDbg 调试器 (windbg.exe)。 若要调试 Windows 服务,您可以将 WinDbg 调试器附加到托管服务之后将启动该服务, 的进程或您可以配置要在 WinDbg 与启动服务,以便在服务启动相关的问题的疑难解答附加调试器。 本文介绍了这两种方法。
要求
本文假定您熟悉下列主题:
在服务启动后将 WinDbg 调试器附加到服务
此方法是类似于将一个调试器附加到进程,然后调试一个进程可以使用该方法。
使用要调试该服务所在进程的进程 ID
- 若要确定进程 ID (PID) 要调试该服务所在进程的使用下列方法之一。
方法 1: 使用任务管理器
- 用鼠标右键单击该任务栏,然后单击 任务管理器。 将出现 Windows 任务管理器 对话框。
- 单击 Windows 任务管理器 对话框的 进程 选项卡。
- 在 映像名称,下单击所要调试该服务所在进程的图像名称。 请注意按相应的 PID 字段的值指定此进程的进程 ID。
方法 2: 使用任务列表工具 (tlist.exe)
- 单击 开始,然后单击 运行。 在 运行 对话框出现。
- 在 打开 框中键入 cmd,然后单击 确定。
- 在命令提示符更改以反映您的计算机上 tlist.exe 文件位置的目录路径。
注意 tlist.exe 文件通常位于以下目录中: 是 Files\Debugging 工具 Windows - 在命令提示符键入 tlist 列出图像名称和进程的当前运行在您的计算机的所有进程的 id。
注意 记下要调试该服务所在进程的进程 ID。
- 在命令提示符处更改以反映您的计算机上 windbg.exe 文件位置的目录路径。
注意 如果未打开命令提示符下,请按照步骤一和 b 的方法 1。 windbg.exe 文件通常位于以下目录中: 是 Files\Debugging 工具的 Windows。 - 在命令提示符键入 windbg –p ProcessID ProcessID/g WinDbg 调试器附加到承载服务要调试的进程。
注意ProcessID 是占位符,您要调试该服务所在进程的进程 ID。
使用要调试该服务所在进程的图像名称
只有一个正在运行的进程承载您要运行该服务的实例,您可以使用此方法。 若要执行此操作,请按照下列步骤操作:
- 单击 开始,然后单击 运行。 在 运行 对话框出现。
- 在 打开 框中键入 cmd,然后单击 确定 以打开命令提示符。
- 在命令提示符更改以反映您的计算机上 windbg.exe 文件位置的目录路径。
注意 windbg.exe 文件通常位于以下目录中: 是 Files\Debugging 工具的 Windows。 - 在命令提示符键入 windbg –pn ImageName ImageName/g WinDbg 调试器附加到承载服务要调试的进程。
注意ImageName 是占位符,您要调试该服务所在进程的图像名称。 在"-pn"命令行选项指定 ImageName 命令行参数是一个进程的图像名称。
启动 WinDbg 调试器并附加到承载服务要调试的进程
- 启动 Windows 资源管理器。
- 找到您的计算机上 windbg.exe 文件。
注意 windbg.exe 文件通常位于以下目录中: 是 Files\Debugging 工具 Windows - 运行 windbg.exe 文件/g 命令行开关来启动在 WinDbg 调试器。 / g 命令行开关允许继续设置中断点后被跟踪的过程。
- 在 文件 菜单上单击 附加到一个进程 以显示 附加到进程 对话框。
- 单击以选中对应于该进程承载您要调试,服务节点,然后单击 确定。
- 在出现对话框中单击 是 以保存基工作区信息。 请注意,您现在可以调试您的服务的反汇编的代码。
若要在 WinDbg 以开始服务配置附加调试器
使用此方法可以调试服务,如果要解决服务启动相关的问题。
- 配置"图像文件执行"选项。 若要执行此操作使用下列方法之一:
方法 1: 使用全局标志编辑器 (gflags.exe)
- 启动 Windows 资源管理器。
- 找到您的计算机上 gflags.exe 文件。
注意 gflags.exe 文件通常位于以下目录中: 是 Files\Debugging 工具的 Windows。 - 运行 gflags.exe 文件以启动全局标志编辑器。
- 在 图像文件名称 文本框中键入所要调试该服务所在进程的图像名称。 渚嬪如果想调试由具有图像名称作为 MyService.exe 的进程承载的服务键入 MyService.exe。
- 在 目标,下单击选择 图像文件选项 选项。
- 在 图像调试器选项,下单击以选中 调试器 复选框。
- 在 调试器 文本框中键入您要使用调试器的完整路径。 渚嬪如果要在 WinDbg 调试器使用调试服务,您可以键入完整的路径是类似于以下内容: Windows\windbg.exe 的是 Files\Debugging 工具
- 单击 应用,然后单击 确定 以退出全局标志编辑器。
方法 2: 使用注册表编辑器
- 单击 开始,然后单击 运行。 在 运行 对话框出现。
- 在 打开 框中键入 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: 使用服务控制台
- 单击 开始,然后指向 程序。
- 在 程序 菜单上指向 管理工具,然后单击 服务。 将出现 服务 控制台。
- 鍦 ㄥ 彸绐楁牸涓 服务 的控制台,用鼠标右键单击 ServiceName,然后单击 属性。
注意ServiceName 是占位符,您要调试服务的名称。 - 在 登录 选项卡中,单击以选中 允许服务与桌面交互 复选框,在 本地系统帐户,然后单击 确定。
方法 2: 使用注册表编辑器
- 在注册表编辑器中找到,并单击以下注册表子项:
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 是占位符,您要调试服务的名称。
鐤戦毦瑙 g 瓟
跨网络调试服务,请确保符号和源文件的尝试之前都可以从将在运行该服务的计算机访问服务使用。 若要执行此操作使用下列方法之一:
- 授予对该文件夹包含符号和该服务使用的源文件在计算机上的所有用户都至少读取访问权限。
- 将这些符号和该服务使用的源文件复制到计算机将运行服务。
要下载该工具和本文中提到的实用程序,请访问下面的 Microsoft 网站:
有关详细信息,请访问下面的 Microsoft 开发网络 (MSDN) 的网站: