如何使用 ADPlus 解决“挂起”和“崩溃”问题
本页概要
ADPlus 是 Microsoft 产品支持服务 (PSS) 提供的一个工具,它可以解决停止响应(挂起)或失败(崩溃)的任何进程或应用程序的问题。ADPlus (ADPlus.vbs) 通常可以用作 Microsoft Internet Information Server (IIS) 异常监视器 (6.1/7.1) 和用户模式进程转储的替代工具。这是两个单独的工具,PSS 经常在 Microsoft Windows DNA 环境中使用它们确定进程停止响应(挂起)或意外退出(崩溃)的原因。 更多信息系统要求ADPlus 具有以下最低要求:
ADPlus 6.0 版的新增功能ADPlus V6.0 已经过彻底改写,它具有了新的开关和新的功能。现在,您可以通过外部配置文件来对该工具进行配置。您可以在 Microsoft Windows 调试器程序包附带的调试器帮助文件 (Debugger.chm) 中查看有关这些新功能和新开关的更新信息。要获取该程序包,请访问下面的 Microsoft 网站:http://www.microsoft.com/whdc/devtools/debugging/default.mspx (http://www.microsoft.com/whdc/devtools/debugging/default.mspx) Debugger.chm 与 ADPlus.vbs 位于同一文件夹中。要找到 ADPlus 的文档,请单击“目录”选项卡,然后依次单击以下各项:
ADPlus 有哪些功能?ADPlus 是基于控制台的 Microsoft Visual Basic 脚本。它使 Microsoft CDB 调试程序自动生成包含来自一个或多个进程的调试输出的内存转储和日志文件。每当 ADPlus 运行时,调试信息(包含调试信息的内存转储和文本文件)都将放置在本地文件系统或远程网络共享目录上的新的、唯一命名的文件夹(例如,C:\Temp\Crash_Mode__Date_01-22-2001__Time_09-41-08AM)中。此外,ADPlus 创建的每一个文件均具有唯一的名称(例如,PID-1708__Inetinfo.exe__Date_01-22-2001__Time_09-41-08AM.log),以避免较新的文件覆盖较旧的文件。ADPlus 可用于任何用户模式进程或服务,例如 Internet 信息服务 (IIS)、Microsoft Transaction Server (MTS) 或 Microsoft COM+ 应用程序。 下面列出了 ADPlus 的某些功能:
何时应使用 ADPlus?ADPlus 用于向 Microsoft PSS 支持专业人员提供调试信息,支持专业人员需要这些调试信息来确定在复杂环境中出现的问题的原因。如果您遇到下列问题,应使用 ADPlus 捕获调试信息:
何时不应使用 ADPlus?在下列情况下不应使用 ADPlus:
从哪里获取 ADPlus?ADPlus 随最新的 Microsoft Debugging Tools for Windows 一起提供。要获取最新的 Microsoft Debugging Tools for Windows,请访问下面的 Microsoft 网站:http://www.microsoft.com/whdc/devtools/debugging/default.mspx (http://www.microsoft.com/whdc/devtools/debugging/default.mspx) ADPlus 是如何工作的?ADPlus 具有两种操作模式:
挂起模式在此模式下,ADPlus 在脚本结束运行后立即为在命令行中指定的所有进程生成完全内存转储。创建的每一个 .dmp 文件都会放在包含运行 ADPlus 时的日期/时间戳的文件夹中。每一个文件名都包含进程名、进程 ID,以及运行 ADPlus 时的日期/时间戳。在进程内存正被转储到某一文件时,该进程被冻结。在创建完内存转储文件之后,通过将非侵害性连接/分离与 CDB 调试程序一起使用来恢复进程。使用提示:您可以在挂起模式下使用 ADPlus 来代替 Userdump.exe,为一个或多个进程转储内存。此外,挂起模式还适用于终端服务器会话。 崩溃模式在此模式下,ADPlus 将 CDB 调试程序连接到在命令行中指定的所有进程。ADPlus 自动配置调试程序以监视下列类型的异常:
注意:Windows XP 和 Microsoft Windows Server 2003 操作系统上的终端服务器会话支持崩溃模式。 当 ADPlus 在崩溃模式下运行时,调试程序在捕获到致命异常和进程意外退出前,或在用户按下 Ctrl+C 组合键以将调试程序与该进程分离前,保持连接到在命令行中指定的每一进程,直到该进程的生存期结束。要手动将调试程序与进程分离,必须最大化调试程序窗口,然后按 Ctrl+C 来中断调试程序。 在按 Ctrl+C 时,ADPlus 捕获此命令,开始将所有线程的堆栈列出到一个日志文件中,然后在它与调试程序分离前生成该进程的小内存转储记录。因为崩溃模式执行侵害性连接,所以在分离调试程序时,该进程终止。必须重新启动该进程。如果它是 MTS 或 COM+ 进程,则下次调用该程序包中的组件时,该进程会自动重新启动。 第一次偶然发生的异常每种类型的异常(如访问冲突或堆栈溢出)都可以作为第一次偶然发生的异常或第二次偶然发生的异常对调试程序引发。根据定义,第一次偶然发生的异常是非致命异常,除非它未使用错误处理程序正确处理。如果发生此问题,它将作为第二次偶然发生的异常再次引发(只有调试程序可以处理这些异常)。如果没有任何调试程序处理第二次偶然发生的异常,则应用程序将退出。有关第一次偶然发生的异常和第二次偶然发生的异常以及 Windows NT SEH(结构化异常处理)的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章: 105675 (http://support.microsoft.com/kb/105675/)
第一次和第二次偶然发生的异常的处理
默认情况下,在 ADPlus 对除未知异常和 EH 异常之外的所有异常类型检测到第一次偶然发生(非致命)的异常时,它将采取以下措施:
不过,您可以为第一次偶然发生的 EH 和未知异常配置 ADPlus,以生成唯一小内存转储。为此,必须使用配置文件来自定义 ADPlus。 第二次偶然发生的异常当 ADPlus 对所有类型的异常(包括 EH 和未知异常)检测到第二次偶然发生的(致命)异常时,它将采取以下措施:
121366 (http://support.microsoft.com/kb/121366/)
.PDB 和 .DBG 文件的说明
291585 (http://support.microsoft.com/kb/291585/) 如何为 Visual C++ 应用程序创建调试符号
有关如何获取 Microsoft 产品的符号的更多信息(这是用调试程序分析内存转储所需的),请访问下面的 Microsoft 网站:http://www.microsoft.com/whdc/devtools/debugging/default.mspx/symbols.mspx (http://www.microsoft.com/whdc/devtools/debugging/default.mspx/symbols.mspx) ADPlus 命令行开关要使用 ADPlus,您必须为脚本指定一系列命令行开关或参数。ADPlus 至少需要两个开关:一个开关指定操作模式,另一个开关指定要对其执行操作的目标进程。下面列出了最常用的开关。您还可以通过运行“ADPlus –help”,或通过阅读调试程序帮助文件 (Debugger.chm) 来查看完整的开关列表。
首次运行 ADPlus默认情况下,调试程序安装到 C:\Program Files\Debugging Tools for Windows 文件夹中。要更改安装文件夹,请在安装调试程序时执行自定义安装,并指定其他文件夹。此外,如果执行了典型安装,则只需将 Program Files\Debugging Tools for Windows 文件夹的内容复制到其他文件夹中即可。要运行 ADPlus,请打开命令外壳程序,切换到调试程序安装或复制到的文件夹,然后键入 ADPlus.vbs。 系统可能会提示您将默认脚本解释器从 Wscript.exe 更改为 Cscript.exe。Microsoft 强烈建议您允许 ADPlus 将 CSCript 配置为默认脚本解释器。 语法ADPlus 使用以下语法: ADPlus.vbs mode of operation processes to monitor optional switches 其中,mode of operation 是“-hang”或“-crash”processes to monitor 是“-iis”、“-pn process.exe”或“-p PID” optional switches 是“-notify”、“-o”或“-quiet”。 准备服务器以用于崩溃模式调试在崩溃模式下运行 ADPlus 之前,必须准备服务器以从 ADPlus 崩溃模式调试会话获取最多信息。将基于 Windows 2000 的服务器用于在崩溃模式下调试的准备步骤
将基于 Windows NT 4.0 的服务器用于在崩溃模式下调试的准备步骤
有关如何获取 Microsoft 调试符号的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章: 268343 (http://support.microsoft.com/kb/268343/)
Umdhtools.exe:如何使用 Umdh.exe 查找内存泄漏
在配置服务器之后,您可以在崩溃模式下运行 ADPlus。此模式将在“常见 ADPlus 使用情况”一节中进行说明。
常见 ADPlus 使用情况本节介绍您可能必须运行 ADPlus 的一些常见情况。进程停止响应或占用 100% 的 CPU 使用率在此情况下,进程可能会在一段持续时间内或无限地随机占用 100% 的 CPU。您应在挂起模式下运行 ADPlus,以获取发生问题后占用 CPU 的进程的内存转储。例如,可使用以下命令语法之一:ADPlus -hang -p 1896
如果在 CPU 被 100% 占用的情况下在挂起模式下运行 ADPlus,该工具将生成您在命令行中指定的进程的内存转储文件。
此命令在挂起模式下运行 ADPlus,并生成 PID 为 1896 的进程的完全内存转储文件。 ADPlus -hang -pn myapp.exe 此命令在挂起模式下运行 ADPlus,并生成名为 Myapp.exe 的所有进程的完全内存转储文件。 ADPlus -hang -iis -pn myapp.exe -o c:\temp 此命令在挂起模式下运行 ADPlus,并生成 IIS、Mtx.exe 或 Dllhost.exe 的所有实例及名为 Myapp.exe 的所有进程的完全内存转储文件。然后它将这些内存转储文件放在 C:\Temp 文件夹中。 注意:在某些极少数情况下,调试程序可能无法在 100% 的 CPU 占用条件下或在发生挂起之后连接到进程。如果您在发生问题之后在挂起模式下运行 ADPlus,则该工具可能无法生成内存转储文件。在这些情况下,最好在出现问题之前连接到调试程序。为此,请使用下列命令语法之一在崩溃模式下运行 ADPlus: ADPlus -crash -p 1896
然后,在进程挂起或占用 100% CPU 使用率后,用户可以在 ADPlus 生成的最小化的调试程序窗口中按 Ctrl+C,以便调试程序可以为进程生成内存转储文件。
此命令在崩溃模式下为 PID 为 1896 的进程运行 ADPlus。ADPlus 将等待异常发生或等待用户在最小化的调试程序窗口中按 Ctrl+C,以生成内存转储文件并分离调试程序。 ADPlus -crash -pn myapp.exe 此命令在崩溃模式下为名为 Myapp.exe 的进程运行 ADPlus。ADPlus 将等待异常发生或等待用户在最小化的调试程序窗口中按 Ctrl+C,以生成内存转储文件并分离调试程序。 ADPlus -crash -iis -pn myapp.exe -o c:\temp 此命令在崩溃模式下为名为 Myapp.exe 和 Inetinfo.exe 进程的所有实例及 Mtx.exe 或 Dllhost.exe 的所有实例运行 ADPlus。ADPlus 将等待异常发生或等待用户在一个或多个最小化的调试程序窗口中按 Ctrl+C,以生成内存转储文件并分离调试程序。接下来,ADPlus 将内存转储文件和日志文件放在 C:\Temp 文件夹中。 注意:默认情况下,ADPlus 只有在用户按 Ctrl+C 时才生成小内存转储记录。此设置可节省磁盘空间。在这种情况下,配置 ADPlus 以在用户按 Ctrl+C 时生成完全内存转储文件可能是非常有用的。为此,请使用“–CTCF”开关。此外,为 CPU 使用率接近 100% 以及已达到 100% 的这一阶段捕获性能日志文件或系统监视器日志文件通常非常有帮助。至少,此日志文件应在 1 到 5 秒的间隔捕获以下对象:
进程意外退出在这种情况下,进程可能会随机意外退出(或崩溃)。您应在崩溃模式下运行 ADPlus,以便在发生问题前获取退出的进程的内存转储文件。例如,可使用以下命令语法之一:ADPlus -crash -iis 注意:如果您正在崩溃模式下从本地控制台运行 ADPlus(而不是像下一节中描述的那样,从远程命令外壳程序运行),则必须在调试会话期间保持登录到该控制台上。
此命令在崩溃模式下运行 ADPlus,并使该工具将 CDB 调试程序连接到正在计算机上运行的 Inetinfo.exe 和所有 Mtx.exe 或 Dllhost.exe 进程。然后,ADPlus 将等待任何第一次偶然异常和第二次偶然异常发生。因为省略“-o”开关,所以默认情况下 ADPlus 将所有文件都放在安装文件夹的子文件夹中。 ADPlus -quiet -crash -iis -notify remote computer -o c:\temp 此命令在崩溃模式下以安静方式运行 ADPlus(不弹出任何对话框,并且将所有输出全部记录到事件日志中),并使该工具将 CDB 调试程序连接到正在计算机上运行的 Inetinfo.exe 和所有 Mtx.exe 或 Dllhost.exe 进程。因为使用了“-notify”开关,所以只要检测到崩溃或者所监视的进程退出,调试程序就会向登录到名为 remote computer 的计算机上的所有用户发出通知。因为使用了“-o”开关,所以 ADPlus 将所有输出都放在 C:\Temp 文件夹中。如果该文件夹不存在,ADPlus 会创建它。 ADPlus -crash -iis -o \\server\share 此命令与前面的命令大致相同,只有一个例外,即它将所有输出都记录到网络服务器中。ADPlus 在 \\server\share 中创建一个新子文件夹,并根据本地计算机命名该子文件夹。因此,如果您正在 Web 场中运行 ADPlus,则该场中正在运行 ADPlus 的每一个服务器都在 \\server\share 下记录自己的唯一文件夹。(您不必为每一个服务器创建唯一文件夹。ADPlus 将自动执行此操作。) 例如,假设您在崩溃模式下启动 ADPlus,并使用“-iis”开关监视 IIS。当您从控制台注销时,在控制台上运行的 Cdb.exe 的副本(以及所有正在运行的其他应用程序)将退出。因此,调试停止,并且所监视的进程结束。 要避免此问题,您可以锁定控制台会话(按 Ctrl+Alt+Del 组合键,然后单击“锁定计算机”),或者从已计划以非交互方式运行(即,它不要求交互登录)的远程命令外壳程序运行 ADPlus。 有关如何计划远程命令外壳程序以非交互方式运行的更多信息,请参见“常见 ADPlus 使用情况:在崩溃模式下从远程运行”一节。 MTS 或 COM+ 服务器应用程序意外退出在 MTS 或 COM+ 服务器应用程序内运行的自定义组件对象模型 (COM) 组件实际在替代进程(Mtx.exe 或 Dllhost.exe)内运行。这些替代进程具有您可以通过 MTS Explorer(对于 Windows NT 4.0)或组件服务 Microsoft 管理控制台 (MMC) 管理单元(对于 Windows 2000、Windows XP 和 Windows Server 2003)配置的属性和设置。默认情况下,MTS 或 COM+ 服务器应用程序配置为在三分钟空闲时间后退出。为了确保这些进程在调试程序已连接且正监视异常时保持运行,必须将它们配置为“空闲时保持运行”。 此外,MTS 和 COM+ 实现了 Failfast。Failfast 是一种保护措施,旨在使生成未处理的访问冲突的 MTS/COM+ 进程失败(或使之退出)。 默认情况下,在引发未处理的访问冲突异常的 MTS 或 COM+ 应用程序中启用 Failfast。因此,失败的 MTS/COM+ 服务器应用程序无法引发第二次偶然发生的访问冲突异常(即,它在第一次偶然发生访问冲突后就退出)。默认情况下,ADPlus 被配置为只在第一次偶然发生异常时生成小内存转储记录。 要成功地调试 MTS/COM+ 服务器应用程序,请按照下列步骤操作:
在崩溃模式下从远程运行在许多情况下,有必要从本地客户端计算机在崩溃模式下启动 ADPlus,以监视在服务器场中的一个或多个远程服务器上意外退出的进程。通常,在 Windows 2000 上,这是通过 Windows 终端服务执行的。但是,您无法调试在 Windows NT 4.0 和 Windows 2000 上的不同窗口工作站内运行的应用程序,因此 ADPlus 在检测到崩溃模式功能在终端服务会话中运行时,它会禁用该功能。要解决此问题,请使用 Remote.exe 实用工具共享远程服务器,在远程服务器上创建一个启动命令外壳程序的批处理文件,然后使用“AT”命令安排此批处理文件在目标服务器上运行。(“AT”命令使命令外壳程序以非交互方式运行,与服务类似。)然后,将远程命令外壳程序连接到使用同一 Remote.exe 实用工具(用来启动命令外壳程序)的本地工作站或客户端计算机。要使用“AT”命令在服务器上启动远程命令外壳程序,请按照下列步骤操作:
其他信息和已知问题
参考这篇文章中的信息适用于:
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。 | 文章翻译
|

回到顶端
