1、如何读取 Windows 为进行调试而创建的小存储器转储文件概要本文分步介绍了如何检查小存储器转储文件。使用该文件,可以确定计算机停止响应的原因。小存储器转储文件小存储器转储文件记录可帮助确定计算机为什么意外停止的最小的有用信息集。此选项要求启动卷上有一个至少为 2 MB 的页面文件。在运行 Microsoft Windows 2000 或更高版本的计算机上,计算机每次意外停止时 Windows 都会新建一个文件。这些文件的历史记录存储在一个文件夹中。该转储文件类型包括以下信息: Stop 消息及其参数和其他数据 加载的驱动程序的列表 已停止的处理器的上下文 (PRCB) 已停止的进程的信息和
2、内核上下文 (EPROCESS) 已停止的进程的信息和内核上下文 (ETHREAD) 已停止的线程的内核模式调用堆栈当硬盘空间有限时,小存储器转储文件十分有用。但是,由于包括的信息有限,因此,通过分析此文件,可能无法发现并非由正在运行的线程在出现问题时直接导致的错误。如果发生第二个问题并且 Windows 创建第二个小存储器转储文件,则 Windows 会保留以前的文件。Windows 为每个文件提供一个用日期编码的独特文件名。例如,Mini022900-01.dmp 是 2000 年 2 月 29 日生成的第一个存储器转储文件。Windows 将所有小存储器转储文件的列表保存在 %Syste
3、mRoot%Minidump 文件夹中。 配置转储类型要配置启动和故障恢复选项以使用小存储器转储文件,请按照下列步骤操作。注意:由于 Microsoft Windows 有多个版本,因此下列步骤可能与在您的计算机上执行的步骤有所不同。如果是这样,请参阅您的产品文档来完成这些步骤。 1.单击“开始”,指向“设置”,然后单击“控制面板”。 2.双击“系统”。3.单击“高级”选项卡,然后单击“启动和故障恢复”下的“设置”。4.在“写入调试信息”列表中单击“小存储器转储 (64k)”。要更改小存储器转储文件的文件夹位置,请在“转储文件”框中(或在“小转储目录”框中,具体取决于 Windows 的版本)
4、键入新路径。用于读取小存储器转储文件的工具站点下载并安装 Windows 调试工具程序包: http:/ Web 页,还可以访问用于 Windows 的可下载符号程序包。要使用该资源,可以在所下载的本地符号或符号服务器使用的符号缓存将驻留的磁盘驱动器上创建一个文件夹。例如,使用 C:Symbols。您可以将下面的符号路径与本文中介绍的所有命令一起使用: SRV*c:symbols*http:/ 打开转储文件打开开始程序Debugging Tools for WindowsWinDbg出现以下画面。添加字符库链接在 symbol path 下添加 srv*C:sys*http:/ Open Cr
5、ash Dump 打开 minidump 文件选择 dump 文件后,Windbg 就开始分析 dump 文件。如下图所示等分析完成后,这个工具会列出造成蓝屏的文件,如下图所示:蓝屏由 uhcd.sys 造成。您还可以使用多个命令收集转储文件中的信息,其中包括以下命令: “!analyze -show”命令显示 Stop 错误代码及其参数。Stop 错误代码也称为“调试检查代码”。 !analyze -v 命令显示详细的输出内容。 lm N T 命令列出指定的加载模块。输出内容包括模块的状态和路径。要获取有关其他命令的帮助以及完整的命令语法,请参阅调试工具的帮助文档。在以下位置可以找到调试工具
6、的帮助文档: C:Program FilesDebugging Tools for WindowsDebugger.chm注意:如果您具有与符号相关的问题,请使用 Symchk 实用工具验证是否正确加载了正确的符号。 有关如何使用 Symchk 的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章: 311503 使用 Microsoft Symbol Server 获取调试符号文件更多细节 以下例子是网上的高手共享分析 dump 文件的例子,供大家参考。没有安装调试符号的情况在没有安装调试符号的情况下,我们运行 ADPlus.vbs,看看有什么结果。运行下列命令,
7、它将导致对 Inetinfo.exe 和其他 Out-Of-Process (OOP)应用程序的 Full-Memory Dumps:cscript.exe adplus.vbs -hang -iisCScript 将会输出:Microsoft (R) Windows Script Host Version 5.6Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.以及一个对话框提示你安装调试符号:对话框上建议您安装好调试符号后,新建一个环境变量“_NT_SYMBOL_PATH”保存调试符号的安装路径。然后,让我
8、们继续:The -hang switch was used, Autdoump is running in hang mode.Dumping process info for IIS 5.x and all COM+ server applicationsexcept for the System application.-Dumping process: IIS (INETINFO.EXE)(Process ID: 1140)最后有一个对话框报告日志存放地点:这时候,默认在 Debugging Tools For Windows 安装路径下新建了一个目录,它的名字类似于这样“Normal_
9、Hang_Mode_Date_10-28-2002_Time_21-25-1919” 。下面是 Dump 的内容:MemoryDump 文件PID-792_INETINFO.EXE_full_2002-10-28_21-25-25-750_0318.dmp,和相应的说明 PID-792_INETINFO.EXE_Date_10-28-2002_Time_21-25-1919.log。说明文件中会依次给出以下信息: Autodump+启动的时间 操作系统信息 运行计算机名 堆栈信息 句柄信息 线程堆栈遍历信息 加载的模块信息 DLL 信息 关键段信息 线程 CPU 使用情况信息这是肉眼看得懂的。
10、至于高达十几 MB 的 DMP 文件,只有让 WinDBG 来解释了。启动 Windbg,按 Ctrl+D,将出现选择 “Open crash Dump”文件对话框,选中上面的PID-792_INETINFO.EXE_full_2002-10-28_21-25-25-750_0318.dmp。当出现对话框询问是否保存 Workspace Information 时,选择 Yes。之后 Windbg 将会出现两个窗口“Disassembly”和“Command” 。这里我们不需要“Disassembly”窗口,关掉它。“Command”窗口将会告诉你,当 Dump 进行时,Active Thre
11、ad 在做什么。由于我们没有安装调试符号,所以只能遗憾地看到:Symbol search path is: * Invalid * : Verify _NT_SYMBOL_PATH settingExecutable search path is: .Wake debugger - code 80000007 (! second chance !)eax=00000001 ebx=00000000 ecx=0027aa80 edx=00000000 esi=00000000 edi=00000068eip=77f8fb68 esp=0006f8a0 ebp=0006f910 iopl=0 nv
12、 up ei pl zr na po nccs=001b ss=0023 ds=0023 es=0023 fs=0038 gs=0000 efl=00000246* ERROR: Symbol file could not be found. Defaulted to export symbols for ntdll.dll - ntdll!NtReadFile+b:77f8fb68 c22400 ret 0x24* ERROR: Symbol file could not be found. Defaulted to export symbols for ADVAPI32.dll 这时,输入
13、命令“kb” ,这是召唤线程堆栈信息的符咒。你可以查看 Windbg 帮助,那里写得很明白:KB(Display Stack Backtrace),B 就是显示传入每一个函数的前三个参数。输出如下所示:0:000 kbChildEBP RetAddr Args to Child WARNING: Stack unwind information not available. Following frames may be wrong.0006f910 77da86d3 00000068 0006f9d8 00000216 ntdll!NtReadFile+0xb0006f93c 77da943
14、1 00000068 0006f9d8 00000216 ADVAPI32!SetSecurityDescriptorSacl+0x4c0006f9b8 77d929f7 00000068 0006f9d8 00000216 ADVAPI32!StartServiceCtrlDispatcherW+0x34d0006fbf4 01002884 00279390 010040c8 00000000 ADVAPI32!StartServiceCtrlDispatcherA+0x720006fd30 01001e94 002d7f98 00000024 0006ffc0 inetinfo+0x288
15、477dfdbee 2474ff50 2474ff0c fb93e80c 55c3ffff inetinfo+0x1e940c24448d 00000000 00000000 00000000 00000000 0x2474ff50上面的输出可以大致分为三列内容: ChildEBP (列 1) RetAddr (列 2) Args to Child (列 3 5)其他可以尽情练习的命令有: *kb: *代表对于所有的线程应用后面的 kb 动作 !locks : show all critical sections (这样你就可以看到挂起时哪一个线程在等待了) lm - List Modules
16、 loaded in the Process dump dc - Dump address 这几个命令都是重点推荐的,不可不试!安装调试符号的情况以上介绍的是没有安装调试符号的情况,我们来看一看安装了之后有什么不同。首先,安装调试符号。其次,最好新建一个环境变量:重新打开 Windbg。这次 Windbg 加载了 Dmp 文件之后,就会报告找到了调试符号:Symbol search path is: D:NTSymbolsExecutable search path is: .Wake debugger - code 80000007 (! second chance !)eax=000000
17、04 ebx=00000000 ecx=00000000 edx=00000000 esi=00000000 edi=0000006ceip=77f82861 esp=0006f8a0 ebp=0006f910 iopl=0 nv up ei pl zr na po nccs=001b ss=0023 ds=0023 es=0023 fs=0038 gs=0000 efl=00000246* WARNING: symbols timestamp is wrong 0x3af357eb 0x38175b30 for ntdll.dllntdll!_output+567:77f82861 c224
18、00 ret 0x24* WARNING: symbols timestamp is wrong 0x3c1aab1e 0x385134fe for ADVAPI32.dll我们来比较一下“*kb”命令在两种情况下的区别:没有安装调试符号情况下:4 id: 420.484 Suspend: 1 Teb 7ffda000 Unfrozen* ERROR: Symbol file could not be found. Defaulted to export symbols for RPCRT4.DLL - ChildEBP RetAddr Args to Child WARNING: Stack
19、 unwind information not available. Following frames may be wrong.0119ff74 77d375ec 77d37a82 00280068 00270000 ntdll!ZwReplyWaitReceivePortEx+0xb0119ffa8 77d379a0 0027b898 0119ffec 77e76523 RPCRT4!RpcBindingSetOption+0x6e90119ffb4 77e76523 0028f788 00270000 50000161 RPCRT4!RpcBindingSetOption+0xa9d01
20、19ffec 00000000 77d37988 0028f788 00000000 KERNEL32!TlsSetValue+0x115安装了调试符号:4 id: 420.484 Suspend: 1 Teb 7ffda000 UnfrozenChildEBP RetAddr Args to Child 0119ff74 77d375ec 77d37a82 00280068 00270000 ntdll!memmove+0x140119ffa8 77d379a0 0027b898 0119ffec 77e76523 RPCRT4!LOADABLE_TRANSPORT:LOADABLE_TRA
21、NSPORT+0x970119ffb4 77e76523 0028f788 00270000 50000161 RPCRT4!ReadSeed+0x110119ffec 00000000 77d37988 0028f788 00000000 KERNEL32!CreateThread+0x13也就是说,微软警告你没有调试符号的情况下,可能会被一个错误的堆栈误导。很明显,两种情况下堆栈展开的也不一样。所以我们强烈建议您安装调试符号。处理崩溃的触发模式能够自动处理 Crash 情况,也是 AD+让人激赏的功能之一。你可以配置 ADPlus,让它一直运行,当发生异常时,选择几种方式处理:用信使服务通
22、知管理员,或者自动 Dump memory。它能监视的异常有: Invalid Handle Illegal Instruction Integer Divide by Zero Floating Point Divide by Zero Integer Overflow Invalid Lock Sequence Access Violation Stack Overflow C+ EH Exception Unknown Exception 这也是一个管理员早就希望拥有的功能了吧。总结一下,大致的使用步骤是: 安装 Windows2000 的调试符号 安装 Windows2000 SP1 的调试符号 安装 Windows2000 SP2 的调试符号 新建环境变量“_NT_SYMBOL_PATH” 安装 Microsoft Debugging Tools for Windows 最新版本 当 IIS Hang 时,运行脚本 cscript.exe adplus.vbs -hang -iis 用 Windbg 加载 dmp 文件,运用各种命令组合观察。值得注意的是,AD+已经被扩展,而不仅仅限于拯救 IIS 和 COM+,一般的应用和服务也完全支持。