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 的文档,请单击“目录”选项卡,然后依次单击以下各项:

  • 使用 Debugging Tools for Windows
  • 故障转储文件
  • 用户模式转储文件
  • 创建用户模式转储文件
  • ADPlus

此外,也可以通过单击“索引”选项卡来查找 ADPlus 的文档。在关键字文本框中键入 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 使用最新的 Microsoft 调试程序来改进功能、提高速度和增强可靠性。
  • 当 ADPlus 为多个进程转储内存时,它异步进行转储,以便同时冻结和转储每一进程。此方法可以在 ADPlus 已运行时提供整个应用程序的有效“快照”。您必须同时捕获构成应用程序的所有进程,以及该应用程序使用的所有进程,以便您可以在发生问题时捕获该应用程序 的状态。这对于使远程过程调用其他进程的应用程序尤为重要。
  • ADPlus 具有命令行界面。因为 ADPlus 没有图形用户界面,所以它可以从远程命令外壳程序(通过使用 Remote.exe 远程输出的命令外壳程序)中在安静模式下运行(不显示对话框)。在安静模式下,错误显示在控制台中并被写入到事件日志中。有关如何从远程命令外壳程序运行 ADPlus 的更多信息,请参见本文的“使用情况”一节。
  • 当 ADPlus 监视崩溃时,如果您使用“-notify”开关,并且启动了 Windows Messenger 服务,ADPlus 可以通过 Windows Messenger 服务提醒用户或计算机发生了崩溃。
  • 当 ADPlus 在崩溃模式下监视进程时,如果发生了崩溃,ADPlus 就会将与该崩溃类型有关的重要信息发送到事件日志。
  • ADPlus 支持 XCOPY 部署。如果您在测试计算机上安装随 ADPlus 一起提供的调试程序包,则可以将安装调试程序的文件夹复制到其他计算机中。此外,ADPlus 不要求您在系统上注册任何自定义组件对象模型 (COM) 组件。因此,您可以在具有锁定软件配置的生产服务器上使用 ADPlus。要删除 ADPlus,只需删除它安装到或复制到的文件夹。

何时应使用 ADPlus?

ADPlus 用于向 Microsoft PSS 支持专业人员提供调试信息,支持专业人员需要这些调试信息来确定在复杂环境中出现的问题的原因。

如果您遇到下列问题,应使用 ADPlus 捕获调试信息:

  • 进程停止响应。
  • 进程在单处理器计算机上占用 100% 的 CPU、在双处理器计算机上占用 50% 的 CPU、在四处理器计算机上占用 25% 的 CPU,依此类推。
  • 进程崩溃或意外关闭。

何时不应使用 ADPlus?

在下列情况下不应使用 ADPlus:

  • 如果您必须解决在启动过程中意外退出的程序或进程的问题。您只能将 ADPlus 用于成功启动的进程。要解决在启动过程中意外退出的进程的问题,用户模式进程转储可能是更好的解决办法。 有关用户模式进程转储的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
    253066  (http://support.microsoft.com/kb/253066/ ) OEM 支持工具第 3 阶段 Service Release 2 可用性
    或者,您可以使用最新的调试程序手动调试进程。有关最新调试程序的更多信息,请访问下面的 Microsoft 网站:
    http://www.microsoft.com/whdc/devtools/debugging/default.mspx (http://www.microsoft.com/whdc/devtools/debugging/default.mspx)
  • 如 果在崩溃模式下使用 ADPlus 对性能有显著的影响。这通常是由引发许多 Microsoft Visual C++ EH 异常的动态链接库 (DLL) 或程序导致的。(当您使用 C++“throw”语句或者使用“try/catch”块时会发生这些异常。)将大量信息写入调试输出流的程序也可能导致性能下降。在大多数情况 下,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 具有两种操作模式:

  • “挂起”模式用于解决进程挂起、100% CPU 使用率以及不涉及崩溃的其他问题。当您在挂起模式下使用 ADPlus 时,在运行脚本之前必须等待,直到进程停止响应(与崩溃模式不同,挂起模式不是持久性的)。
  • “崩溃”模式用于解决 Dr. Watson 错误导致的崩溃问题,或者用于解决导致程序或服务意外退出的任何其他类型的错误。当您在崩溃模式下使用 ADPlus 时,必须在发生崩溃启动 ADPlus。可以通过“-notify”开关对 ADPlus 进行配置,以便通知管理员或计算机发生了崩溃。

挂起模式

在此模式下,ADPlus 在脚本结束运行后立即为在命令行中指定的所有进程生成完全内存转储。创建的每一个 .dmp 文件都会放在包含运行 ADPlus 时的日期/时间戳的文件夹中。每一个文件名都包含进程名、进程 ID,以及运行 ADPlus 时的日期/时间戳。在进程内存正被转储到某一文件时,该进程被冻结。在创建完内存转储文件之后,通过将非侵害性连接/分离与 CDB 调试程序一起使用来恢复进程。

使用提示:您可以在挂起模式下使用 ADPlus 来代替 Userdump.exe,为一个或多个进程转储内存。此外,挂起模式还适用于终端服务器会话。

崩溃模式

在此模式下,ADPlus 将 CDB 调试程序连接到在命令行中指定的所有进程。ADPlus 自动配置调试程序以监视下列类型的异常:

  • 无效句柄
  • 非法指令
  • 整数被零除
  • 浮点数被零除
  • 整数溢出
  • 无效的锁定顺序
  • 访问冲突
  • 堆栈溢出
  • C++ EH 异常
  • 未知异常

在解决上述类型的异常问题时,您可以在崩溃模式下用 ADPlus 来代替 IIS 异常监视器或 Userdump.exe。由于崩溃模式通过 CDB 调试程序使用“侵害性”连接,因此它在 Microsoft Windows NT 4.0 或 Windows 2000 终端服务器会话内不起作用。在这些操作系统上的终端服务器会话内,只使用挂起模式,因为它们需要使用非侵害性连接。有关如何通过最新的调试程序以侵害性或 非侵害性方式连接到进程的更多信息,请参见调试程序帮助中的“使用 Debugging Tools for Windows:连接到正在运行的进程(用户模式)”部分。

注意: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 异常之外的所有异常类型检测到第一次偶然发生(非致命)的异常时,它将采取以下措施:

  1. 暂停该进程,以便在被监视的进程的日志文件中记录发生异常的日期和时间。
  2. 在被监视的进程的日志文件中记录引发异常的线程的线程 ID 和调用堆栈。
  3. 在异常发生时生成进程的唯一命名的小内存转储记录(“.dump -u /m”),然后恢复该进程。

注意: 默认情况下,ADPlus 不为第一次偶然发生的 EH 和未知异常生成唯一小内存转储记录,因为这些异常会频繁地发生。这类异常通常由进程或 DLL 中的错误处理代码处理。由于这些是被处理的异常,因此它们不会变为第二次偶然发生的(未处理的)异常,并且不会结束进程。

不过,您可以为第一次偶然发生的 EH 和未知异常配置 ADPlus,以生成唯一小内存转储。为此,必须使用配置文件来自定义 ADPlus。

第二次偶然发生的异常

当 ADPlus 对所有类型的异常(包括 EH 和未知异常)检测到第二次偶然发生的(致命)异常时,它将采取以下措施:

  1. 暂停该进程,以便在被监视的进程的日志文件中记录发生异常的日期和时间。
  2. 在被监视的进程的日志文件中记录引发异常的线程的线程 ID 和调用堆栈。
  3. 在发生致命异常时生成进程的完全内存转储,然后退出调试程序。此操作将破坏该进程。

注意:Microsoft PSS 支持专业人员为了分析内存转储,可能必须获取任何自定义组件或 DLL 以及其对应的符号文件的副本。 有关如何为 DLL 创建符号文件的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

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) 来查看完整的开关列表。

  • -hang
    此开关将 ADPlus 配置为在挂起模式下运行。您必须将此开关与“-iis”、“-pn”或“-p”开关一起使用。不能将“-hang”与“-crash”开关一起使用。

    注意:当 ADPlus 在挂起模式下运行时,您必须在进程停止响应或占用很高的 CPU 使用率之后启动 ADPlus。
  • -crash
    此开关将 ADPlus 配置为在崩溃模式下运行。您必须将此开关与“-iis”、“-pn”或“-p”开关一起使用。不能将“-crash”与“-hang”开关一起使用。

    注意:当 ADPlus 在崩溃模式下运行时,您必须在进程意外退出或者变得不稳定之前启动 ADPlus。
  • -pn process name
    “-pn”开关用于指定您希望 ADPlus 分析的进程名。要指定多个进程,请使用多个“-pn process name”开关。例如:
    -pn process1.exe -pn process2.exe
  • -p process ID
    “-p”开关用于指定您希望 ADPlus 分析的进程的 ID (PID)。要指定多个进程,请使用多个“-p PID”开关。例如:
    -p 1896 -p 1702
  • -iis
    “- iis”开关用于调试运行 Internet Information Server (IIS) 4.0 或更高版本的服务器计算机。在将 ADPlus 与“-iis”开关一起使用时,ADPlus 监视所有 IIS 进程内 (Inetinfo.exe) 和进程外 (Mtx.exe/Dllhost.exe) 应用程序。“-iis”开关可以与“-pn”开关或“-p”开关一起使用,也可以单独使用,以分析 IIS 和所有在崩溃模式或挂起模式下运行的 MTS/COM+ 应用程序。

    如果您尝试分析运行 IIS 3.0 或更低版本的服务器计算机,请使用“-pn”开关并将 Inetinfo.exe 指定为要监视的进程。
  • -notify computer nameuser name
    只 有当 ADPlus 在崩溃模式下运行时此开关才有效。此开关指示 ADPlus 提醒指定的用户名或计算机名发生了崩溃。当调试程序由于第二次偶然发生的异常从进程分离时,或者当用户按 Ctrl+C 停止调试时,就会通过本地信使服务向远程用户或计算机发送通知。只有正在被调试的计算机上启动了本地信使服务时,才会发送此通知。
  • -quiet
    此 开关指示 ADPlus 不显示所有模式对话框。如果您正在从远程命令外壳程序(其中模式对话框可能导致 ADPlus 无限期地等待用户单击“确定”)内运行 ADPlus,则此开关将非常有用。为保证获得最佳效果,请确保这是传递给 ADPlus.vbs 的第一个开关。
  • -o output directory
    此开关指示 ADPlus 在哪里放置调试输出文件。如果使用长文件名,则必须用双引号将它们括起来。此外,还可以使用 UNC 路径 (\\server\share)。如果使用 UNC 路径,则 ADPlus 在紧跟您指定的 UNC 路径的下方创建一个新文件夹。根据正在运行 ADPlus 的服务器命名该文件夹(例如,\\server\share\Web1 或 \\server\share\Web2)。如果 ADPlus 在 Web 场中的多台计算机上(这些计算机全都将其输出放置于同一网络共享上)运行,则此开关十分有用。

首次运行 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 的服务器用于在崩溃模式下调试的准备步骤

  1. 将 Windows 2000 SP1 或 SP2 符号安装到服务器上的 C:\WINNT\Symbols 文件夹中。您可从下面的 Microsoft 网站下载这些符号:
    Windows 2000 SP1
    http://www.microsoft.com/windows2000/downloads/servicepacks/sp1/debug/default.asp (http://www.microsoft.com/windows2000/downloads/servicepacks/sp1/debug/default.asp)

    Windows 2000 SP2
    http://www.microsoft.com/windows2000/downloads/servicepacks/sp2/debug/default.asp (http://www.microsoft.com/windows2000/downloads/servicepacks/sp2/debug/default.asp) 在下载了 Sp1sym.exe 或 Sp2sym.exe 后,从指定的文件夹运行该文件。
  2. 得到相应提示后,将这些文件提取到新的临时文件夹(例如,C:\Sp1sym 或 C:\Sp2sym)中,或者提取到具有足够磁盘空间的驱动器或文件夹中。
  3. 运 行 C:\Sp1sym\Support\Debug\Symbols\i386\Symbols_spexe 或 C:\Sp2sym\Support\Debug\Symbols\i386\Symbols_spexe(其中,C:\Sp1sym 或 C:\Sp2sym 是在上一步中文件提取到其中的文件夹)。
  4. 当提示您是否同意 EULA 时,请单击“是”。
  5. 当提示您选择可以将文件提取到其中的文件夹时,请单击“C:\WINNT\Symbols”,然后单击“确定”。请注意,将出现新的 C:\WINNT\Symbols 文件夹。此文件夹包含名为 DLL 和 EXE 等的各种子文件夹。
  6. 将自定义 DLL 和 SP1 或 SP2 后的所有修补程序的符号复制到 C:\WINNT\Symbols\Dll 文件夹中。
  7. 将自定义 .exe 文件的符号复制到 C:\WINNT\Symbols\Exe 文件夹中。此外,您必须从开发人员那里获取任何 .pdb 或 .dbg 文件,并将这些文件放在 C:\WINNT\Symbols\Dll 文件夹中。
  8. 使用修补程序中的版本覆盖 C:\WINNT\Symbols\Dll 文件夹中已存在的所有 .dbg 或 .pdb 文件。

    注意:可以使用最新版本的 Winzip 打开修补程序包。可以从 \Debug 子文件夹中提取符号。每个修补程序自安装程序中都包含 \Debug 子文件夹。
  9. 创建一个 _NT_SYMBOL_PATH 环境变量,并将其设置为等于 C:\WINNT\Symbols。此变量可以是系统变量或用户环境变量。

将基于 Windows NT 4.0 的服务器用于在崩溃模式下调试的准备步骤

  1. 假设您正在运行 Windows NT 4.0 Service Pack 6a。将 Windows NT 4.0 SP6a 符号安装到服务器上的 C:\WINNT\Symbols 文件夹中。要下载这些符号,请访问下面的 Microsoft 网站:
    http://www.microsoft.com/ntserver/nts/downloads/recommended/SP6/debug/default.asp (http://www.microsoft.com/ntserver/nts/downloads/recommended/SP6/debug/default.asp)
    在下载了 Sp6symi.exe 后,从指定的文件夹运行它。
  2. 得 到相应提示后,将这些文件提取到 C:\WINNT 文件夹中(或者,如果这些符号未安装到 C:\WINNT,则替代相应的 \WINNT 文件夹)。请注意,将出现新的 C:\WINNT\Symbols 文件夹,该文件夹具有名为 DLL、EXE 等的各种子文件夹。
  3. 将子文件夹从 C:\WINNT\Symbols\IIS4 文件夹复制到 C:\WINNT\Symbols 中。提示您覆盖所有文件时,请单击“是”。
  4. 将自定义 DLL 和 SP6a 后的所有修补程序的符号复制到 C:\WINNT\Symbols\Dll 文件夹中。
  5. 将自定义 .exe 文件的符号复制到 C:\WINNT\Symbols\Exe 文件夹中。此外,您必须从开发人员那里获取任何 .pdb 或 .dbg 文件,并将这些文件放在 C:\WINNT\Symbols\Dll 文件夹中。
  6. 使用修补程序中的版本覆盖 C:\WINNT\Symbols\Dll 目录中已存在的所有 .dbg 或 .pdb 文件。

    注意:可以使用最新版本的 Winzip 打开修补程序包。可以从 \Debug 子文件夹中提取符号。每个修补程序自安装程序中都包含此子文件夹。
  7. 创建一个 _NT_SYMBOL_PATH 环境变量,并将其设置为等于 C:\WINNT\Symbols。此变量可以是系统变量或用户环境变量。

虽然您不一定要将符号下载并安装到所调试的服务器上,但我们强烈建议您这样做。在将符号下载并安装到服务器上后,在日志文件中捕获的输出对 Microsoft PSS 非常有用。

有关如何获取 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
此命令在挂起模式下运行 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 文件夹中。

如果在 CPU 被 100% 占用的情况下在挂起模式下运行 ADPlus,该工具将生成您在命令行中指定的进程的内存转储文件。

注意:在某些极少数情况下,调试程序可能无法在 100% 的 CPU 占用条件下或在发生挂起之后连接到进程。如果您在发生问题之后在挂起模式下运行 ADPlus,则该工具可能无法生成内存转储文件。在这些情况下,最好在出现问题之前连接到调试程序。为此,请使用下列命令语法之一在崩溃模式下运行 ADPlus:

ADPlus -crash -p 1896
此命令在崩溃模式下为 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 文件夹中。

然后,在进程挂起或占用 100% CPU 使用率,用户可以在 ADPlus 生成的最小化的调试程序窗口中按 Ctrl+C,以便调试程序可以为进程生成内存转储文件。

注意:默认情况下,ADPlus 只有在用户按 Ctrl+C 时才生成小内存转储记录。此设置可节省磁盘空间。在这种情况下,配置 ADPlus 以在用户按 Ctrl+C 时生成完全内存转储文件可能是非常有用的。为此,请使用“–CTCF”开关。此外,为 CPU 使用率接近 100% 以及已达到 100% 的这一阶段捕获性能日志文件或系统监视器日志文件通常非常有帮助。至少,此日志文件应在 1 到 5 秒的间隔捕获以下对象:

  • 内存
  • 进程
  • 处理器
  • 系统
  • 线程

进程意外退出

在这种情况下,进程可能会随机意外退出(或崩溃)。您应在崩溃模式下运行 ADPlus,以便在发生问题获取退出的进程的内存转储文件。例如,可使用以下命令语法之一:

ADPlus -crash -iis
此 命令在崩溃模式下运行 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(而不是像下一节中描述的那样,从远程命令外壳程序运行),则必须在调试会话期间保持登录到该控制台上。

例如,假设您在崩溃模式下启动 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+ 服务器应用程序,请按照下列步骤操作:

  1. 将 MTS/COM+ 服务器应用程序配置为“空闲时保持运行”。
  2. 使用“FullOnFirst”开关,以便在遇到第一次偶然发生的异常时创建完全转储文件。
  3. 在崩溃模式下运行 ADPlus 并等待该应用程序失败。

注意:由于 MTS 和 COM+ 关闭服务器应用程序,并且由于 Failfast 策略使进程无法引发第二次偶然发生的异常,因此您可能只能获取第一次偶然访问冲突内存转储文件。

在崩溃模式下从远程运行

在许多情况下,有必要从本地客户端计算机在崩溃模式下启动 ADPlus,以监视在服务器场中的一个或多个远程服务器上意外退出的进程。通常,在 Windows 2000 上,这是通过 Windows 终端服务执行的。但是,您无法调试在 Windows NT 4.0 和 Windows 2000 上的不同窗口工作站内运行的应用程序,因此 ADPlus 在检测到崩溃模式功能在终端服务会话中运行时,它会禁用该功能。要解决此问题,请使用 Remote.exe 实用工具共享远程服务器,在远程服务器上创建一个启动命令外壳程序的批处理文件,然后使用“AT”命令安排此批处理文件在目标服务器上运行。(“AT”命 令使命令外壳程序以非交互方式运行,与服务类似。)然后,将远程命令外壳程序连接到使用同一 Remote.exe 实用工具(用来启动命令外壳程序)的本地工作站或客户端计算机。

要使用“AT”命令在服务器上启动远程命令外壳程序,请按照下列步骤操作:

  • 在远程服务器上
    假设调试程序安装到 C:\Debuggers 中。请按照下列步骤操作:
    1. 在 C:\Debuggers 文件夹中,创建一个名为 Remoteshell.cmd 的新批处理文件。
    2. 将下面一行添加到这个批处理文件中:
      c:\debuggers\remote.exe /s "cmd.exe" remoteshell
    3. 在服务器的控制台上或在终端服务会话中,打开新的命令外壳程序,然后键入以下命令:
      AT 15:00 c:\debuggers\remoteshell.cmd
      其中,“15:00”晚于当前时间一分钟。例如,如果当前时间是 14:59,则键入 15:00
    4. 等待“AT”命令运行。
    5. 在命令提示符处,键入 AT(不带任何参数),以验证该任务是否正常运行。
  • 在本地客户端上
    您应在本地客户端计算机上安装调试程序,或至少应从本地复制 Remote.exe 实用工具。(默认情况下,该实用工具与调试程序一起安装在根安装文件夹中。)

    假设这些调试程序和 Remote.exe 实用工具安装到 C:\Debuggers 中。请按照下列步骤操作:
    1. 在命令提示符处,切换到 C:\Debuggers 文件夹。
    2. 键入下面的命令:
      remote.exe /c remote server remoteshell
      其中,remote server 是远程服务器的名称。
    3. 您的本地命令外壳程序现在连接到正在服务器上运行的远程命令外壳程序,并且您在本地键入的所有命令都将在远程服务器上执行(DIR c:\ 命令列出远程服务器上的驱动器 C 的内容)。
    4. 在 远程命令外壳程序中,您现在可以在崩溃模式下运行 ADPlus,就像从控制台本地运行它一样。但是,必须使用“-quiet”开关,以便不显示 ADPlus 默认情况下生成的所有对话框。如果不使用“-quiet”开关,远程命令外壳程序会在运行 ADPlus 后停止响应,并且不会返回到提示符处。如果发生此问题,您必须退出服务器上的远程命令外壳程序 (Cmd.exe),然后启动新实例。
    5. 要 向 ADPlus 当前正通过崩溃模式远程调试的进程发送调试中断 (Ctrl+C),必须使用 Breakin.exe 实用工具。默认情况下,Breakin.exe 随调试程序一起安装在调试程序文件夹的根文件夹中。例如,要停止调试正在运行的进程 ID 为 1975 的 IIS (Inetinfo.exe),请在远程命令外壳程序中键入以下命令:
      breakin.exe 1975
      或者,您可以使用 Kill.exe 命令(该命令也位于根调试程序文件夹中)退出正在调试的任何进程。

其他信息和已知问题

  • 如何确定 ADPlus 是否已捕获与崩溃有关的信息或者如何确定在崩溃模式下正被监视的进程是否已关闭?

    可以使用多种方法确定这些信息:
    • 使用“-notify”开关,并确保在所调试的服务器上以及将接收通知的客户端计算机上启动信使服务。
    • 在文本编辑器中,打开在每一个进程的输出文件夹中显示的 .log 文件,然后,滚动到该文件的末尾,找到以下文本:
           0:070> * -------- AutodumpPlus 4.01 finished running at: --------
      0:070> .time
      Debug session time:Mon Aug 06 15:25:15 2001
      System Uptime:3 days 17:00:34
      Process Uptime:1 days 3:10:38
      0:070> * -------------------------------------------------------
    • 在输出文件夹中,查找包含短语“__2nd_chance”的所有 .dmp 文件。如果此短语出现在内存转储记录的标记中,则进程已意外退出。
    • 在输出文件夹中,查找包含短语“__Process_was_shutdown”的所有 .dmp 文件。如果此短语出现在内存转储记录的标记中,则管理员退出该进程;或者,如果该进程是 MTS/COM+ 应用程序,则说明它由于到达空闲时间限制而退出。
    • 在 输出文件夹中,查找包含短语“__CTRL-C”的所有 .dmp 文件。如果此短语出现在内存转储记录的标记中,则或者从正在进程内运行的 DLL 引发了调试中断异常,或者某人从控制台按了 Ctrl+C(或者在 ADPlus 从远程运行的情况下使用了 Breakin.exe),以停止当前调试会话。
  • 必须在系统上安装 Windows Scripting Host 组件才能运行 ADPlus。要下载 Windows Scripting Host,请访问下面的 Microsoft 网站:
    http://msdn2.microsoft.com/en-us/library/ms950396.aspx (http://msdn2.microsoft.com/en-us/library/ms950396.aspx)
    注意:如果您安装了以下任何 Microsoft 产品,则可能已安装了 Windows Scripting Host 组件:
    • Microsoft Internet Explorer 5
    • Microsoft Office 2000
    • Microsoft Visual InterDev 6.0
    • Microsoft Visual Studio 6.0
    • Microsoft Windows NT Option Pack
    • Microsoft Windows 2000
  • 只有在安装了 Internet Information Server (IIS) 4.0 或 Internet 信息服务 (IIS) 5.0x 的情况下,“-iis”开关才起作用。
  • 当您以安静模式运行 ADPlus 时,它会将信息记录到事件日志中。
  • 如果您使用“-o”开关,则指定的路径不得包含多个不存在的文件夹。例如:
    1. 您指定 -o c:\temp1\temp2,但是 C:\Temp1 和 \Temp2 文件夹不存在。
    2. 您会从 ADPlus 接收到一条错误消息,指出这两个文件夹不存在,并且 ADPlus 将不会创建它们。
    如果您只指定 -o c:\temp1,则 ADPlus 会创建 C:\Temp1 文件夹(如果该文件夹不存在),然后将所有输出文件都放到该文件夹中。如果您要指定多个子文件夹并使用“-o”开关,则在运行 ADPlus 之前,请确认所有这些子文件夹是否都存在。
  • 在 COM+ 中,您可以在程序包的“属性”对话框中的“高级”选项卡上配置服务器程序包,使之在调试程序中启动。如果启用“在调试程序中启动”选项,则 ADPlus 无法将 CDB 调试程序连接到进程。默认情况下,一次只能有一个调试程序连接到进程。
  • 当从 ADPlus 正在崩溃模式下进行分析的进程对已退出(故意或意外地)的另一个进程进行远程过程调用 (RPC) 时,ADPlus 为正被分析的进程创建的日志文件可能包含以下一个或多个异常:
    Unknown exception - code 80010105 (first chance)
    Unknown exception - code 800706be (first chance)
    Unknown exception - code 800706ba (first chance)
    这些异常都是普通异常。当从所监视的进程对不存在或已失败的进程进行调用时,RPC 会引发这些异常。

    此外,如果 ADPlus 正在 Inetinfo.exe 进程的 ADPlus 调试日志中监视该进程,则可能还会在该日志中显示以下异常:
    Unknown exception - code 800706bf (first chance)
    此异常通常在 IIS 对已失败的进程外(高隔离级别)网站进行调用后出现。它可能后跟以下异常的两个实例:
    Unknown exception - code 800706ba (first chance)
posted @ 2009-06-17 16:44  h-hello  阅读(420)  评论(0编辑  收藏  举报