玄铁剑

成功的途径:抄,创造,研究,发明...
posts - 128, comments - 42, trackbacks - 0, articles - 174

如何调试 Windows 服务

Posted on 2007-01-05 20:29 玄铁剑 阅读(1866) 评论(0)  编辑 收藏 引用 所属分类: Debug

Microsoft Debugging Tools for Windows
http://msdl.microsoft.com/download/symbols/debuggers/dbg_x86_6.6.07.5.exe
注意:这篇文章是由无人工介入的自动的机器翻译系统翻译完成。这些文章是微软为不懂英语的用户提供的, 以使他们能够理解这些文章的内容。微软不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的使用所引起的任何直接的, 或间接的可能的问题负责。

文章编号 : 824344
最后修改 : 2006年12月8日
修订 : 5.0

概要

本文介绍如何通过使用 WinDbg 调试器 (windbg.exe) 调试 Windows 服务。 要调试 Windows 服务, 您可以附加到进程承载服务, 服务启动后 WinDbg 调试器也可以配置服务以启动使用 WinDbg 调试器附加以便可解决服务启动 - 相关问题。 本文介绍这两种方法。

要求

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

服务启动后 WinDbg 调试器附加到服务

此方法是类似于方法, 您可用于将调试器附加到进程和然后调试进程。

使用进程 ID 的宿主服务, 您要调试进程

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

注意 tlist.exe 文件通常位于以下目录: C:\ProgramFiles\Microsoft Files\Debugging 工具用于 Windows
d. 在命令提示符处, 键入 tlist 要列出图像名称和过程的所有计算机上当前运行的进程 ID。

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

注意 如果命令提示符是未打开, 按照和 b 的方法 1。 windbg.exe 文件通常位于以下目录: C:\ProgramFiles\Microsoft Files\Debugging 工具用于 Windows。
3. 在命令提示符处, 键入 / windbg ûp ProcessID g 将 WinDbg 调试器附加到宿主服务, 您要调试进程。

注意 ProcessID 是占位符代表进程承载服务, 您要调试的进程 ID。

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

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

注意 windbg.exe 文件通常位于以下目录: C:\ProgramFiles\Microsoft Files\Debugging 工具用于 Windows。
4. 在命令提示符处, 键入 / windbg ûpn ImageName g 将 WinDbg 调试器附加到宿主服务, 您要调试进程。

注意 ImageName 是占位符代表的宿主服务, 您要调试进程图像名称。 " - pn 命令行选项指定 ImageName 命令行参数是的进程图像名称 "。

启动 WinDbg 调试器并附加到宿主服务, 您要调试进程

1. 启动 Windows 资源管理器。
2. 计算机上定位 windbg.exe 文件。

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

配置要使用附加 WinDbg 调试器启动服务

您可使用此方法来调试服务如果您想解决服务启动 - 相关问题。
1. 配置 " 图像文件执行 " 选项。 要这样做, 使用下列方法之一:
方法 1: 使用全局标志编辑器 (gflags.exe)
a. 启动 Windows 资源管理器。
b. 计算机上定位 gflags.exe 文件。

注意 gflags.exe 文件通常位于以下目录: C:\ProgramFiles\Microsoft Files\Debugging 工具用于 Windows。
c. 运行 gflags.exe 文件以启动全局标志编辑器。
d. 在 图像文件名称 文本框中, 键入的宿主服务, 您要调试进程图像名称。 如果要调试服务是由具有作为图像名称, MyService.exe 进程宿主例如, 键入 MyService.exe 。
e. 在 目标 , 单击以选中 图像文件选项 选项。
f. 在 图像调试器选项 , 单击以选中 调试器 复选框。
g. 调试器 文本框中, 键入调试器, 您要使用的完整路径。 例如, 如果要使用 WinDbg 调试器来调试服务, 可键入完整路径是类似于以下: Windows\windbg.exe C:\ProgramFiles\Microsoft Files\Debugging 工具 Windows\windbg.exe C:\ProgramFiles\Microsoft Files\Debugging 工具 :
h. 单击 应用 , 然后单击 确定 以退出全局标志编辑器。
方法 2: 使用注册表编辑器
a. 开始 , 依次 运行 。 出现 运行 对话框。
b. 在 打开 框中, 键入 regedit , 然后单击 确定 以启动注册表编辑器。
c. 警告 如果正确修改注册表通过注册表编辑器或通过其他方法可能发生 Serious 问题。 这些问题可能需要重新安装操作系统。 Microsoft 不能保证能够解决这些问题而。 修改注册表需要您自担风险。

在注册表编辑器, 查找, 并右以下注册表子项:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options
d. 依次指向 新建 , 密钥 。 在左窗格中的注册表编辑器, 注意 新项 # 1 的新注册表子项 (名称), 将选中进行编辑。
e. 类型 ImageName 要替换 新项 # 1 , 并按 ENTER 键。

注意 ImageName 是占位符代表的宿主服务, 您要调试进程图像名称。 如果要调试服务是由具有作为图像名称, MyService.exe 进程宿主例如, 键入 MyService.exe
f. 右击步骤 e 中创建注册表子项。
g. 指向 New , 然后单击 字符串值 。 在右窗格中的注册表编辑器, 注意, 将 新值 # 1 的新注册表项, 名称, 选中进行编辑。
h. 调试器 , 替换 新值 # 1 , 然后按 Enter。
i. 右键单击与您在步骤 h, 创建 调试器 注册表项, 然后单击 修改 。 出现 编辑字符串 对话框。
j. 在 数值数据 文本框中, 键入 DebuggerPath 然后单击 确定 。

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

注意 ServiceName 是占位符代表服务, 您要调试的名称。
d. 在 登录 选项卡, 单击以选中 允许服务与桌面交互以 复选框在 LocalSystem 帐户 , 然后单击 确定 。
方法 2: 使用注册表编辑器
a. 中注册表编辑器, 找到, 并单击以下注册表子项:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ServiceName
替换为对要调试服务名称 注意 替换 ServiceName 。 例如, 如果要调试服务名 MyService, 找到并单击以下注册表项:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MyService
b. 在右窗格中的注册表编辑器, Name 字段下 类型 , 右击, 然后单击 修改 。 出现 编辑 DWORD 值 对话框。
c. 将 数值数据 文本框中文字更改为二进制 OR 操作的结果与二进制值当前文本和二进制值, 0x00000100, 作为两个操作数。 二进制值, 0x00000100, 对应于计算机上 WinNT.h 头文件中定义 SERVICE_INTERACTIVE_PROCESS 常量。 该常量指定一个服务是特性中交互式。
3. 当服务启动, 服务通讯多久到服务控制管理器服务必须具有要启动超时期 (用于服务)。 如果服务控制管理器没有收到启动 " 服务 " 通知来自服务超时内, 这服务控制管理器终止进程承载服务。 此超时期限通常少于 30 秒。 您正试图调试时如果您不要调整此超时期限, 服务控制管理器结束进程并附加调试器。 若要调整此超时期限, 请按照下列步骤:
a. 在注册表编辑器, 查找, 并右以下注册表子项:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control
b. 指向 New , 然后单击 DWORD 值 。 在右窗格中的注册表编辑器, 注意 新值 # 1 (名称) 的新注册表项, 将选中进行编辑。
c. 键入 ServicesPipeTimeout 以替换 新值 # 1 , 并按 ENTER。
d. 右键单击与您在步骤 c, 创建 ServicesPipeTimeout 注册表项, 然后单击 修改 。 出现 编辑 DWORD 值 对话框。
e. 在 数值数据 文本框中, 键入 TimeoutPeriod 然后单击 确定

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

注意 ServiceName 是占位符代表服务, 您要调试的名称。

疑难解答

尝试通过网络, 调试服务之前确保该符号和该服务使用源文件是从其中将运行服务计算机访问。 要这样做, 使用下列方法之一:
向所有人对您计算机上包含符号和该服务使用源文件文件夹授予至少读取访问权限。
将这些符号和该服务使用源文件复制到计算机将运行服务。

参考

请要下载工具和实用程序, 本文中提到访问以下 MicrosoftWeb 站点:
用于 Windows 调试工具: 概述
http://www.microsoft.com/whdc/devtools/debugging/default.mspx (http://www.microsoft.com/whdc/devtools/debugging/default.mspx)
请, 有关访问下列 Microsoft Developer Network (MSDN) Web 站点:
WinDbg 调试器
http://www.microsoft.com/whdc/devtools/debugging/installx86.mspx (http://www.microsoft.com/whdc/devtools/debugging/installx86.mspx)
服务
http://msdn.microsoft.com/library/en-us/dllproc/base/services.asp (http://msdn.microsoft.com/library/en-us/dllproc/base/services.asp)
TList: 任务列表应用程序示例
http://msdn.microsoft.com/library/en-us/vcsample98/html/vcsmptlist.asp (http://msdn.microsoft.com/library/en-us/vcsample98/html/vcsmptlist.asp)
使用全局标志实用程序
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/devtest_g/hh/DevTest_g/DV_66c1db5c-fbc6-43a9-b318-4b3c0cda1009.xml.asp (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/devtest_g/hh/DevTest_g/DV_66c1db5c-fbc6-43a9-b318-4b3c0cda1009.xml.asp)

这篇文章中的信息适用于:
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 (32-bit x86)
Microsoft Windows Server 2003, Standard Edition (32-bit x86)
Microsoft Windows Server 2003, Datacenter Edition (32-bit x86)
Microsoft Windows XP Home Edition
Microsoft Windows XP Home Edition
Microsoft Windows XP Service Pack 1a
Microsoft Windows XP Home Edition
Microsoft Windows XP Professional
Microsoft Windows XP Professional
Microsoft Windows XP Service Pack 1a
Microsoft Windows XP Professional
只有注册用户登录后才能发表评论。