Windbg内核调试之四: Dump文件分析

简介:

Dump 文件分析很大程度上就是分析蓝屏产生的原因。这种系统级的错误算是Windows提示错误中比较严重的一种(更严重的还有启动黑屏等硬件或软件兼容性错误等等)。说它是比较严重,是因为毕竟Windows还提供了dump文件给用户分析,至少能比较容易的找到错误的原因。一般蓝屏要么是内核程序中的异常或违规,要么是数据结构的损坏,也有boot或shutdown的时候内核出错。有时候蓝屏是一闪而过,紧接着是系统重启;有时候是蓝屏等待。总之蓝屏的时候都提示了一些停止代码和错误信息,不过这些提示是不全面的,最多知道哪个模块出错(比如驱动)。想了解进一步的信息,或者通过搜索引擎,最好的方式当然是dump文件分析。当然,如果有更进一步研究的欲望,内核调试是更好的方法,不过这需要某些软件支持和调试技巧。

类型
Dump文件有三种:完整内存转储,内核内存转储,小内存转储。System Properties中的高级选项中可以看到这些设置。
完整内存转储太大,一般是物理内存大小或多一些,包括了用户进程页面,这种方式不实用,2GB的物理内存转储出来至少要2GB的磁盘空间(还有文件头信息)。内核转储一般是200MB大小(物理内存小于4GB),它只是包含了所有属于内核模式的物理内存。小内存转储一般是64KB(64位上是 128KB),这两种方式是更常用的。
小内存转储在\Windows\Minidump下生成了一个叫Mini日期+序列号.dmp的文件,这个珍贵的资源就是系统Crash时刻的状态,只不过小内存转储只记录的有限的信息,而且在你分析时,如果windbg没有设置符号服务器的路径(关于符号服务器,请参考Windbg内核调试之二: 常用命令),那么你的当前系统必须和发生蓝屏的系统的Ntoskrnl.exe版本相同,否则就有找不到符号的问题产生。
启动windbg,用Open Crash Dump打开dump文件,或者直接拖动文件到windbg中,windbg显示如下信息: 


复制代码
复制代码
Loading Dump File [C:\dbg\Mini052809-01.dmp]
Mini Kernel Dump File: Only registers and stack trace are available
Symbol search path is: SRV*d:/temp/*http://msdl.microsoft.com/download/symbols
Executable search path is:
Windows Vista Kernel Version 6000 (Service Pack 1) UP Free x86 compatible
Kernel base = 0x80400000 PsLoadedModuleList = 0x8046e8f0
Debug session time: Thu May 28 16:12:29.031 2009 (GMT+8)
System Uptime: not available
Loading Kernel Symbols...............................................................
Loading unloaded module list.....................................................................

Loading UserSymbols
********************************************************************************                                                                                                                                           **                        Bugcheck Analysis                                                                                         **                                                                                                                                           ********************************************************************************
Use !analyze -v to get detailed debugging information.
BugCheck 7F, {0, 0, 0, 0}
复制代码
复制代码

大致上提示了Crash系统的版本,加载符号的过程,如果找不到符号文件,还会提示Unable to load image。如下错误就是找不到ntoskrnl.exe的符号文件:

Unable to load image \SystemRoot\system32\ntoskrnl.exe, Win32 error 0n2
*** WARNING: Unable to verify timestamp for ntoskrnl.exe
*** ERROR: Module load completed but symbols could not be loaded for ntoskrnl.exe 

命令
通过lm命令查看模块列表。另外,如果出现Unable to load image,说明没有找到这个文件,这个时候需要查看是否加载了正确的符号文件。设置符号服务器路径(.symfix命令)是很有必要的,因为调试机器和Crash机器的环境很可能不一致。
运行命令kb,显示调用栈的信息。如果有正确的符号设置,可以看到调用的函数名。如果你在调试自己驱动程序的蓝屏问题,请确保设置正确该驱动程序的符号路径,不然就会出现Stack unwind information not available的问题。加入正确的符号文件(pdb)后,可以用命令!reload重新加载符号文件。
通过!thread和!process,可以显示当前进程和线程。或者通过dt nt!_KTHREAD 地址和dt nt!_EPROCESS地址来查看线程和进程结构。

Windbg提供了自动分析dump文件的机制。通过命令!analyze –v,windbg可以自动做分析,显示如下信息:


复制代码
复制代码
*******************************************************************************
*                                                                                                                                          *
*                         Bugcheck Analysis                                                                                       *
*                                                                                                                                          *
*******************************************************************************

DRIVER_IRQL_NOT_LESS_OR_EQUAL (d1)
An attempt was made to access a pageable (or completely invalid) address at an
interrupt request level (IRQL) that is too high.   This is usually
caused by drivers using improper addresses.
If kernel debugger is available get stack backtrace.
Arguments:
Arg1: e1147008, memory referenced
Arg2: 0000001c, IRQL
Arg3: 00000000, value 0 = read operation, 1 = write operation
Arg4: fbe93403, address which referenced memory

Debugging Details:
------------------
READ_ADDRESS:   e1147008 Paged pool
CURRENT_IRQL:   1c
FAULTING_IP:
myfault+403
fbe93403 8b06             mov      eax,dword ptr [esi]

DEFAULT_BUCKET_ID:   DRIVER_FAULT
BUGCHECK_STR:   0xD1
PROCESS_NAME:   NotMyfault.exe

TRAP_FRAME:   f9357b80 --(trap fffffffff9357b80)
ErrCode = 00000000
eax=00000000 ebx=8111f330 ecx=000000d1 edx=0000001c esi=e1147008 edi=00000000
eip=fbe93403 esp=f9357bf4 ebp=f9357c58 iopl=0          nv up ei pl zr na pe nc
cs=0008   ss=0010   ds=0023   es=0023   fs=0030   gs=0000              efl=00010246
myfault+0x403:
fbe93403 8b06             mov      eax,dword ptr [esi]   ds:0023:e1147008=????????
Resetting default scope

LAST_CONTROL_TRANSFER:   from 804f880d to 80527da8

STACK_TEXT:
f9357734 804f880d 00000003 f9357a90 00000000 nt!RtlpBreakWithStatusInstruction
f9357780 804f93fa 00000003 e1147008 fbe93403 nt!KiBugCheckDebugBreak+0x19
f9357b60 80540853 0000000a e1147008 0000001c nt!KeBugCheck2+0x574
f9357b60 fbe93403 0000000a e1147008 0000001c nt!KiTrap0E+0x233
WARNING: Stack unwind information not available. Following frames may be wrong.
f9357c58 805759d1 ffb5c3b0 8111f318 811d9130 myfault+0x403
f9357d00 8056e33c 00000090 00000000 00000000 nt!IopXxxControlFile+0x5e7
f9357d34 8053d808 00000090 00000000 00000000 nt!NtDeviceIoControlFile+0x2a
f9357d34 7c92eb94 00000090 00000000 00000000 nt!KiFastCallEntry+0xf8
0012f9f0 7c92d8ef 7c801671 00000090 00000000 ntdll!KiFastSystemCallRet
0012f9f4 7c801671 00000090 00000000 00000000 ntdll!ZwDeviceIoControlFile+0xc
0012fa54 004018c2 00000090 83360018 00000000 0x7c801671

STACK_COMMAND:   kb

FOLLOWUP_IP:
myfault+403
fbe93403 8b06             mov      eax,dword ptr [esi]

SYMBOL_STACK_INDEX:   4
FOLLOWUP_NAME:   MachineOwner
MODULE_NAME: myfault
IMAGE_NAME:   myfault.sys
DEBUG_FLR_IMAGE_TIMESTAMP:   43774e1d
SYMBOL_NAME:   myfault+403
FAILURE_BUCKET_ID:   0xD1_myfault+403
BUCKET_ID:   0xD1_myfault+403
Followup: MachineOwner
复制代码
复制代码

一般是按照如下:停止码解释,陷阱帧寄存器信息,蓝屏属性(有些除零错误就在这里显示),栈调用,错误指令位置(FOLLOWUP_IP),出错源代码和汇编代码行,错误代码行,出错模块信息(包括负责人等信息),来组织自动分析信息。

通过r命令,可以显示Crash时刻寄存器的状态和最后的命令状态。

通过d命令,可以显示当前内存的地址。在定位了错误代码行了之后,就可以进一步进行内核调试和系统调试了。

相关文章
|
数据可视化 测试技术
一文了解软件测试规范
软件测试规范是测试工作的依据和准则,在进行软件测试时,应在相关国标文件的要求和指导下完成测试工作,这样可以从根本上保证软件测试工作的质量,进而提升软件产品的质量。 一个完整的软件测试规范应该包括对规范本身的详细说明,例如规范的目的、范围、文档结构、词汇表、参考信息、可追溯性、方针、过程/规范、指南、模板、检查表、培训、工具、参考资料等。
1505 0
一文了解软件测试规范
|
Web App开发 网络安全
SSL接收到一个超出最大准许长度的记录 错误处理
SSL接收到一个超出最大准许长度的记录 错误处理
9766 0
SSL接收到一个超出最大准许长度的记录 错误处理
|
并行计算 C++ 异构计算
Nvidia 并行计算架构 CUDA 分析(一)——CUDA 简介
    CUDA(Compute Unified Device Architecture,统一计算设备架构)是由 NVIDIA 推出的通用并行计算架构,该架构使 GPU 能够解决复杂的计算问题。
6400 0
阿里云服务器多少钱一年学生价?学生免费领取教程
阿里云学生免费领云服务器教程:先领300元学生专享代金券,再用券支付云服务器订单,实现免费领取。亲测有效,快来试试!
|
人工智能 物联网 开发工具
百宝箱开放平台 ✖️ IoT 设备接入
本文介绍IoT厂商如何通过开放平台将搭载ESP32芯片的设备与百宝箱智能体集成,涵盖设备接入、配网、绑定及启用全流程,并提供SDK下载与配置指引,助力快速实现AI对话功能。
306 0
We were unable to authorize you in GitHub. Sorry for inconvenience, please try again later. IDEA2022
文章目录 彻底 解决 IDEA 2021 登录 GitHub 登录失败问题 一. 出现这种问题的原因: 二 . 先来看看正常情况下登录: 错误信息 三. 解决方案: 1.取消登录 2.点击加号,选择第二个登录方式 3.核心步骤 4.添加IDEA 授权的tokens 5.生成tokens 6.复制令牌授权码 7.回到IDEA 粘贴授权码 8.登陆成功 9.注意事项
4062 0
We were unable to authorize you in GitHub. Sorry for inconvenience, please try again later. IDEA2022
|
IDE Oracle Java
day4:JDK、IntelliJ IDEA的安装和环境变量配置
【7月更文挑战第4天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
630 0
|
安全 开发工具 虚拟化
使用 VMware + win10 + VirtualKD + windbg 从零搭建双机内核调试环境
使用 VMware + win10 + VirtualKD + windbg 从零搭建双机内核调试环境
|
NoSQL Linux 编译器
内核实验(一):使用QEMU+GDB断点调试Linux内核代码
如何配置环境并使用QEMU虚拟机结合GDB进行Linux内核代码的断点调试,包括安装QEMU、交叉编译工具链,编译内核以及通过GDB远程连接进行调试的详细步骤。
1429 0
内核实验(一):使用QEMU+GDB断点调试Linux内核代码
|
监控
查看服务器/IIS日志、log、访问信息基本方法
除了手动查看,你也可以使用日志分析工具,如Log Parser、AWStats等,这些工具可以帮助你更方便地分析日志数据。
2721 1

热门文章

最新文章