日期:2014-05-16  浏览次数:20684 次

使用Windbg排除蓝屏故障(已发表)

使用Windbg排除蓝屏故障(已发表)
2011年09月28日
   
蓝屏崩溃死机(Blue Screen of Death)是Windows较为常见的系统故障之一,它意味着Windows系统遭遇了严重的错误或危险,而又无法自我修复,被迫强制关机以避免损坏电脑系统。作为系统管理人员,在处理蓝屏死机故障时,需要具备一定的分析方法与技术积累。除了常规的方法,管理员也可以使用Windows调试分析工具来助我们一臂之力,进而找到问题的背后真凶。以下通过一则案例来简单介绍调试工具的使用方法。
  Ø        工具介绍
  Windows Debugging Tools(简称windbg)是微软开发的一款专门用来分析调试Windows
  系统内部错误的工具,它能根据保存下来的内存状态信息,有效的定位到发生严重错误(包括蓝屏死机)的故障位置,找出引起故障的进程,并做进一步的排除。
  您可以在以下网址下载Windows Debugging Tools:
  http://msdn.microsoft.com/en-us/windows/hardware/gg463016.aspx
  .
  Ø        设置转储文件
  为了便于排查蓝屏故障的原因,Windows提供了在蓝屏故障发生时自动将内存状态数
  据保存为内存转储文件(Crash Dump File)的功能,以便我们通过分析内存转储文件查找蓝屏故障原因。
  需要事先设置自动保存内存转储文件。方法如下:右键点击“我的电脑”,依次选择“属性”、“高级”、设置“启动与故障恢复”,在“启动与故障恢复”选项中找到“写入调试信息”的下拉菜单,在下拉菜单中将“无”修改为“小内存转储(64KB)”、“核心内存转储”或“完全内存转储”中的任意一种,即可在下次发生蓝屏故障时自动保存内存转储文件。
  内存转储文件是一种扩展名为 .DMP 的系统文件。其中,“小内存转储”文件保存在 Windows\Minidump 文件夹,文件大小为 64KB,它只记录发生蓝屏故障时的关键信息;“核心内存转储”与“完全内存转储”文件则保存在 Windows 文件夹中,文件名为 MEMORY.DMP,它们分别记录有发生蓝屏故障时的核心内存信息或完整的内存信息。在这里我们选择“小内存转储(64KB)”,既能节省硬盘空间,又能保留必要的错误信息。
  Ø        案例描述
  某台Windows XP电脑在上网时突然发生蓝屏。先是QQ程序异常关闭,再打开时提示
  QQ.exe程序无法初始化,IE浏览器也因访问内存地址失败而关闭(提示该内存地址不能为read),接着360安全卫士亦某些文件执行失败而自动关闭。再过一会,电脑突然蓝屏死机,提示:0x00000050:PAGE_FAULT_IN_NONPAGED_AREA。重启电脑后此故障仍反复发生。
  一、初步分析
  从QQ,360等软件的错误提示信息上可看出,应用软件均访问了内存中的受保护地
  址或不正确的非法地址,从而导致应用程序的执行遭到拒绝。PAGE_FAULT_IN_NONPAGED_AREA 这条信息表明内存或页面文件(即虚拟内存)发生了错误(PAGE_FAULT)。因此初步判断,问题应该出在内存或者程序的兼容性冲突上。
  二、定位调试
  重新启动电脑后,Windows已自动保存故障状态信息,故我们可以使用Windows
  Debugging Tools来进一步定位与分析故障原因所在。
  1.       下载并安装Debugging Tools for Windows工具,运行 windbg.exe程序,选择文件菜单中的“Open Crash Dump”选项。
  2.       找到Windows目录下的内存转储文件(位于Minidump文件夹),文件为mini***-**.dmp,即可打开内存转储文件。
  需要注意的是,在分析转储文件里面的详细信息时,须下载微软的符号文件包,才能将转储信息完整的翻译出来。如果你的电脑能连上互联网,则可以在windbg工具中直接设置连接微软的官方符号服务器,以便加快分析文件的速度。设置方法如下:
  选择“File”菜单下的“Symbol File Path”选项,在“Symbol path”空白处填写如下路径:SRV*f:\websymbols*http://msdl.microsoft.com/download/symbols,其中f:\为电脑中的f分区。设置完成后windbg工具在打开一个内存转储文件是会自动连接微软的symbol服务器,然后把相关原始符号文件下载到f:\websymbols文件夹中。
  三、转储分析
  设置完成之后,windbg工具将自动分析内存转储文件中的相关信息并弹出报告,
  包含系统版本,转储文件位置,符号文件包路径,内核状态代码,可能的故障原因等基本信息。在本例报告中,我们可以直接定位出导致故障的原因在于内存(Probably caused by : memory_corruption)。
  四、细节调试
  如果你不满足于所给出的基本信息,想进一步分析故障的细节,则可以进入内核调
  试模式,在窗口底下调试命令栏输入 kb>!analyze