cc682/NetRoc
http://netroc682.spaces.live.com/
内存转储文件
本节包含:
内核模式Dump文件
用户模式Dump文件
内核模式Dump文件
当发生内核模式错误时,Microsoft Windows的默认行为是显示一个蓝色的屏幕和错误检查数据。
但是,也可以选择一些其它的方式:
- 可以连接一个内核调试器(例如WinDbg和KD)。
- 写入一个内存dump文件。
- 系统可以自动重起。
- 先写入一个内存dump文件,然后重起系统。
本节包含创建和分析内核模式内存转储文件的方法。有三种不同的崩溃转储文件。但是,当系统出错时,没有任何转储文件比直接附加到系统上的内核调试器更加有效和通用。
本节包含:
各种不同的内核模式Dump文件
创建内核模式Dump文件
分析内核模式Dump文件
各种不同的内核模式Dump文件
有三种不同的内核模式dump文件:
完整内存转储
内核转储
小内存转储
内核转储(Kernel-Memory Crash Dump)和小内存转储(Small Memory Dump)仅在Windows 2000和之后的系统上支持。
这些dump文件的不同点之一在于大小。完整内存转储包含最多信息,内核转储要小一些,小内存转储只有64 KB大小。
大文件的好处在于,由于包含更多信息,所以更可能找到崩溃的原因。
小文件的优点在于更小也能够更快的写入。速度经常是很有价值的;如果运行的是服务器,可能希望它在崩溃之后能尽快重起,而dump文件写完之前是不能进行重起的。
完整内存转储或内核转储创建之后,还可以从大一些的dump文件创建小内存转储文件。查看.dump (Create Dump File)命令获取详细信息。
注意 通过分析内核模式dump文件可以获得很多信息。但是没有任何内核模式dump文件能够获得像直接进行内核调试一样多的信息。
完整内存Dump
完整内存dump是最大的内核模式dump文件。这种文件包含发生错误时机器物理内存的所有信息。
该dump文件要求引导驱动器上的页面文件至少有主系统内存那么大:它需要保存大小为整个RAM加上1MB的文件。
完整内存Dump文件默认写入到%SystemRoot%\Memory.dmp。
如果发生第二次错误检查并且创建了另一个完整内存dump(或内核dump),前一个文件会被覆盖掉。
内核Dump
内核Dump包含崩溃时被内核所使用的所有内存。
这种dump文件比完整内存dump要小很多。一般它只有系统物理内存的1/3大小。当然,大小根据不同的情况会有所不同。
该dump文件不会包含未分配的内存,或 任何分配给用户模式程序的内存。它仅包含分配给Windows内核和硬件抽象层(HAL),以及内核模式驱动和其他内核模式程序的内存。
大多数情况下这种崩溃dump是最有用的。它比完整内存dump要小很多,但是只省略了那些不太可能造成崩溃的内存内容。
由于这类dump文件没有包含崩溃时存在的任何用户模式可执行文件的映像,所以如果他们很重要的话,需要设置可执行映像路径。
内核Dump默认写入%SystemRoot%\Memory.dmp。
如果第二次错误检查创建了另一个内核Dump(或完整内存dump),前一个文件会被覆盖掉。
调试内核Dump时要避免显示页面丢失错误的信息,可以使用.ignore_missing_pages 命令。
小内存转储
小内存转储比其他两种内核模式崩溃转储文件都要小很多。它的大小为64 KB,并且只需要引导驱动器上有64 KB的页面文件大小。
这种dump文件包含下面内容:
- 错误检查信息和参数,这和蓝屏时的信息一样。
- 崩溃的处理器的处理器环境(PRCB)。
- 崩溃的进程信息和内核环境(EPROCESS)。
- 崩溃的线程的信息和内核环境 (ETHREAD)。
- 产生崩溃的线程的内核模式调用堆栈。如果它大于16 KB,则只会包含顶部的16 KB的数据。
- 加载的驱动的列表。
在Windows XP和之后版本的Windows中,还会包含以下内容:
- 已加载和卸载的模块列表。
- 调试器数据块。这包含系统的基本调试信息。
- 任何Windows认为对调试错误有帮助的内存页面。包括崩溃发生时寄存器指向的数据页面和出错模块明确请求的页面。
- (仅Intel Itanium 处理器) 备份存储(backing store)。
- (Windows Server 2003 和之后的系统) Windows SKU——例如"Professional" 或"Server"。
当磁盘空间很有限时这种dump文件是有用的。但是,由于仅包含很有限的数据,当错误不是直接由当前线程引起时,分析这种文件可能找不到错误。
由于这种dump文件没有包含崩溃时内存中的任何可执行映像,可能也需要设置可执行映像路径。
如果第二次错误检查发生并且创建了另一个小内存转储文件,前一个文件仍然存在。每个新文件都会有不同的名字,文件名中包含崩溃发生的时间。例如mini022900-01.dmp 是在2000年2月29日产生的第一个内存转储文件。小内存转储文件的列表存放在%SystemRoot%\Minidump 目录中。
创建内核模式Dump文件
有三种创建内核模式dump文件的方法:
- 在控制面板启用dump文件,然后等系统自己崩溃。
- 在控制面板启用dump文件,并强制系统崩溃。
- 通过调试器在不让系统崩溃的情况下创建dump文件。
本节包含:
启用内核模式Dump文件
强制系统崩溃
不使系统崩溃的情况下创建Dump文件
验证内核模式Dump文件的创建
使用NMI开关
也可以使用NMI开关来生成崩溃dump文件。联系硬件供应商来确认机器是否具有这个开关。
本文档不包含NMI开关的使用方法。
启用内核模式Dump文件
系统崩溃时,Windows崩溃转储设置会决定是否创建一个dump文件,以及需要创建哪种大小的dump文件。
Windows控制面板可以控制内核模式崩溃转储的设置。只有系统管理员可以修改这些设置。
要改变这些设置,在控制面板中点击系统(System)图标。选择高级(Advanced)选项卡。在Windows NT 4.0和Windows 2000中,点击启动和恢复(Startup and Recovery)。在Windows XP和之后版本的Windows中,在启动和故障恢复(Startup and Recovery)中点击设置(Settings)按钮。
可以看到下面的对话框:
控制面板:启动和故障恢复对话框
在写入调试信息(Write Debugging Information)中,可以选择默认生成哪种dump文件。每次崩溃时只能创建一个dump文件。默认使用的是小内存转储。查看各种不同的内核模式Dump文件获取三种文件类型的说明。
选好了dump文件大小后,可以使用默认路径和文件名也可以修改掉。
也可以选中或取消将事件写入系统日志(Write an event to the system log)、 发送管理警报(Send an administrative alert)和自动重新启动(Automatically reboot)选项。
如果做出了任何改变,点击确定(OK)后系统会重新启动。
这里选择的设置会应用到所有系统崩溃产生的内核模式dump文件,而不管崩溃是由错误造成的还是由调试器产生的。查看强制系统崩溃获得主动造成崩溃的信息。
但是,这些设置不影响使用.dump 命令创建的dump文件。查看不造成系统崩溃的情况下创建Dump文件获取关于使用该命令的详细信息。
强制系统崩溃
当内核模式dump文件启用后,大多数系统崩溃都会显示蓝屏并 创建一个崩溃转储文件进行写入。
但是,有时候系统会冻结起来而不能进入内核崩溃状态。可能的一些表现为:
- 鼠标指针可以移动,但是不能做任何事。
- 所有的画面被冻结,鼠标指针不能移动,但是分页仍然继续。
- 鼠标和键盘没有任何反应,并且未使用磁盘。
如有存在有经验的调试技术人员,他/她可以接上一个内核调试器来分析问题。关于在这种情况下需要寻找什么东西的提示,可以查看调试停止的系统。
但是,如果没有技术人员,可能想要创建一个内核dump文件并发送给其他地方的技术员。该dump文件可以用来分析错误的原因。
有两种方法可以主动产生系统崩溃:
从调试器强制系统崩溃
从键盘强制系统崩溃
从调试器强制系统崩溃
如果使用KD或WinDbg进行内核调试,则可以强制发生系统崩溃。可以在命令提示符输入.crash (Force System Crash)命令。(如果目标及没有马上崩溃,可以再使用一个g (Go)命令。)
使用了该命令后,系统会调用KeBugCheck 并且产生bug check 0xE2 (MANUALLY_INITIATED_CRASH)。如果崩溃转储没有禁用,这时会创建出一个崩溃转储文件。
崩溃转储文件写入之后,会通知主控机上的内核调试器,这时可以对崩溃的目标机进行活动的调试。
从键盘强制崩溃
可以直接通过键盘造成系统崩溃。在Windows XP中,该功能在使用i8042prt 端口键盘(PS/2 键盘)时可用,而在Windows Vista和之后的系统在USB键盘上也可用。可以通过注册表键来对按键进行完全的配置。
之前先要做两个预备工作:
- 如果希望创建崩溃转储文件,必须先启用dump文件,选择路径和文件名,并选择dump文件的大小。详细信息查看启用内核模式Dump文件。
- 使用PS/2键盘,必须先在注册表中启用键盘产生的崩溃。在注册表键HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\i8042prt\Parameters下,创建一个名为CrashOnCtrlScroll的值,并设置为REG_DWORD 0x1 (或其他任何非0值)。
-
使用USB键盘,必须在注册表键HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\kbdhid\Parameters下创建一个名为 CrashOnCtrlScroll的值,并设置为REG_DWORD 0x1 (或其他任何非0值)。
注意 Kbdhid.sys允许从USB键盘产生一次内存转储过程的功能有一个限制。如果系统在高的中断请求优先级(IRQL)上停止相应的话,CTRL+SCROLL LOCK+SCROLL LOCK 快捷键就不起作用了。该限制是由于Kbdhid.sys 驱动是在比i8042prt.sys 更低的IRQL工作造成的。关于通过USB键盘使用这个功能的更多信息,查看文章Generate a memory dump file by using the keyboard。
必须重起系统这些修改才能生效。
这样做完之后,就可以用下面的方法来从键盘造成崩溃了。按住最右边的CTRL 键,然后安下SCROLL LOCK键两次。
如果CTRL+SCROLL LOCK+SCROLL LOCK 按键序列没有起效,系统可能会冻结起来。但是,这是非常少见的。CTRL+SCROLL LOCK+SCROLL LOCK产生崩溃即使在很多时候CTRL+ALT+DELETE不能工作时依然起效。
系统之后会调用KeBugCheck并产生bug check 0xE2 (MANUALLY_INITIATED_CRASH)。如果没有禁用崩溃转储,这时会创建一个dump文件。
如果有内核调试器附加到冻结中的机器上,崩溃转储文件写入完成后会中断到内核调试器。
不造成系统崩溃的情况下创建Dump文件
如果使用KD或WinDbg进行内河模式调试,可以在不造成目标计算机的系统崩溃的情况下创建内核模式Dump文件。
这可以是完整内存转储或小内存转储文件。这种情况下控制面板中的设置不起作用。
和由崩溃产生的dump文件不同,这种dump文件是写入主控机中的。
详细信息,查看.dump (Create Dump File) 命令。
验证内核模式Dump文件的创建
如果有一台已经中断到调试器的机器,但是不确定崩溃转储文件是否成功写入了,可以执行下面的命令:
dd nt!IopFinalCrashDumpStatus L1
这会显示IopFinalCrashDumpStatus变量的值。
如果值为0,则写入过程完成。如果是-1(0xFFFFFFFF),表明转储进程还没有开始。
其他任何值都表明转储过程出现了错误。
分析内核模式Dump文件
本节包含:
使用KD分析内核模式Dump文件
使用WinDbg分析内核模式Dump文件
使用KAnalyze分析内核模式Dump文件
安装符号文件
不管使用哪种工具,都需要安装产生该dump文件的系统版本的符号文件。用来分析dump文件的调试器需要使用这些文件。关于如何正确安装符号文件,查看安装Windows符号文件。
DumpExam 工具已经作废了。分析崩溃dump文件时不再需要它。
使用KD分析内核模式Dump文件
可以使用KD来分析内核模式内存转储文件。运行KD的处理器平台和Windows版本不需要和生成dump文件的机器一样。
启动KD
和-z 命令行选项一起启动KD来分析dump文件:
kd -y SymbolPath -i ImagePath -z DumpFileName
-v (详细模式)选项也是有用的。关于选项的完整列表,查看KD命令行选项。
可以在运行调试器之后用.opendump (Open Dump File) 后跟g (Go)命令来打开dump文件。
可以同时调试多个dump文件。可以通过在命令行中包含多个-z 开关(每个后跟一个不同的文件名),或者使用.opendump 将更多的dump文件作为调试目标。关于如何控制多目标调试会话的信息,查看调试多个目标。
Dump文件一般是以.dmp 或.mdmp扩展名结尾的。可以使用网络共享或通用命名约定(Universal Naming Convention (UNC))的名字来命名内存dump文件。
Dump文件也经常被打包为CAB文件。如果在-z选项或.opendump 命令后指定了文件名(包含.cab扩展名),调试器可以直接从CAB中读取dump文件。但是,如果单个CAB包中存在多个dump文件,调试器一次只能读取它们中的一个。调试器不会在CAB中读取任何其他文件,即使有和dump文件关联的符号文件或其他文件。
分析Dump文件
如果分析内核Dump或小内存Dump,需要设置可执行映像路径以指向所有在崩溃时加载到内存中的可执行文件。查看可执行映像路径获取详细信息。
分析dump文件和分析其他活动调试会话类似。查看调试器命令参考小节来获得调试内核模式dump文件时可用命令的详细信息。
大多数情况下,应该首先使用!analyze。这个扩展命令可以对dump文件进行自动分析,并且常常会给出很多有用信息。
.bugcheck (Display Bug Check Data) 显示错误检查代码和它的参数。查看错误检查代码参考获得关于特定错误的信息。
下面这些调试器扩展命令对于分析内核模式崩溃转储也非常有用:
!drivers
!kdext*.locks
!memusage
!vm
!errlog
!process 0 0
!process 0 7
关于从dump文件中读取特定种类信息的技术,查看从Dump文件中获取信息。
用WinDbg分析内核模式Dump文件
可以使用WinDbg来分析内核模式内存转储文件。运行WinDbg的处理器平台和Windows版本不需要和生成dump文件的机器一样。
启动WinDbg
和-z 命令行选项一起启动WinDbg来分析dump文件:
windbg -y SymbolPath -i ImagePath -z DumpFileName
-v选项(详细模式)也很有用。关于这些选项的完整列表,查看WinDbg命令行选项。
如果WinDbg已经在运行并且处于静止模式,可以通过File | Open Crash Dump菜单命令或按下CTRL+D快捷键来打开dump文件。当Open Crash Dump 对话框出现后,在File name 文本框输入dump文件的全路径和名字,或使用对话框来选择合适的路径和文件名。选定需要的文件后,点击Open。
可以在调试器已经运行之后使用.opendump (Open Dump File) 命令后跟g (Go)命令来打开dump文件。
可以同时调试多个dump文件。可以通过在命令行中包含多个-z 开关(每个后跟一个不同的文件名),或者使用.opendump 将更多的dump文件作为调试目标。关于如何控制多目标调试会话的信息,查看调试多个目标。
Dump文件一般是以.dmp 或.mdmp扩展名结尾的。可以使用网络共享或通用命名约定(Universal Naming Convention (UNC))的名字来命名内存dump文件。
Dump文件也经常被打包为CAB文件。如果在-z选项或.opendump 命令后指定了文件名(包含.cab扩展名),调试器可以直接从CAB中读取dump文件。但是,如果单个CAB包中存在多个dump文件,调试器一次只能读取它们中的一个。调试器不会在CAB中读取任何其他文件,即使有和dump文件关联的符号文件或其他文件。
分析Dump文件
如果分析内核Dump或小内存Dump,需要设置可执行映像路径以指向所有在崩溃时加载到内存中的可执行文件。查看可执行映像路径获取详细信息。
分析dump文件和分析其他活动调试会话类似。查看调试器命令参考小节来获得调试内核模式dump文件时可用命令的详细信息。
大多数情况下,应该首先使用!analyze。这个扩展命令可以对dump文件进行自动分析,并且常常会给出很多有用信息。
.bugcheck (Display Bug Check Data) 显示错误检查代码和它的参数。查看错误检查代码参考获得关于特定错误的信息。
下面这些调试器扩展命令对于分析内核模式崩溃转储也非常有用:
!drivers
!kdext*.locks
!memusage
!vm
!errlog
!process 0 0
!process 0 7
关于从dump文件中读取特定种类信息的技术,查看从Dump文件中获取信息。
使用KAnalyze分析内核模式Dump文件
内核内存空间分析器(KAnalyze, kanalyze.exe)是另一个可以用来分析内核模式dump文件的工具。
KAnalyze和它的文档是OEM支持工具包的一部分。
要下载该工具,可以到Knowledge Base Article Q253066页面并根据指示操作。