阅读:4028回复:10
出200分,怎样通过分析.dmp文件来定位导致蓝屏的错误代码位置?
当关机的时候发生蓝屏重启的毛病,看了控制面板里的系统日志,发生错误的代码有0x1e,0x0a,0xd1,0x27,没什么规律,有时候蓝,有时候不蓝,这些错误信息都存储在\WINNT\Minidump\Mini020204-01.dmp里,通过什么工具怎样可以定位发生导致蓝屏的驱动程序代码的位置??
请详细说说. 我已经困惑很长时间了. |
|
最新喜欢:txqxc
|
沙发#
发布于:2004-02-10 20:29
第一步,有些通过查看蓝屏代码信息即可大致定位出导致蓝屏的代码的位置。因为很多蓝屏代码的参数里都会记录有发生蓝屏时引用的内存位址,譬如:
计算机已经在检测错误后重新启动。检测错误: 0x0000001e (0xc0000005, 0xf7ce8bad, 0x00000000, 0x00e2ddd0). 这里参数0xf7ce8bad即指向了引起例外的代码位置,通过对照系统内核驱动加载地址表,可找到引起该例外的驱动名,然后再根据PE结构内存映射文件的原理,反编译驱动代码后就可从相应的偏移处找到导致蓝屏的驱动程序代码位置。 第二步,对于没有在蓝屏代码的参数里直接指明引用位址的分析,就要通过保存下的DUMP文件来进行调试分析了,譬如: 计算机已经在检测错误后重新启动。检测错误: 0x0000000a (0x0000002c, 0x00000002, 0x00000000, 0x80441a1e) 调试工具可选用Microsoft的Windbg,调试时需要使用对应DUMP系统的符号文件,调试步骤网上有很多详细的介绍,通过一步步的stack trace,就可以找到引起蓝屏的代码位置了。如果需要进行详细的调试,最好不要采用Minidump,而要设置成完全内存转储。 第三步,对于经常发生蓝屏重启的情况,直接使用softice进行动态调试是最简单有效的方法了,在系统里安装上softice以后,如果系统产生了例外,会直接被softice截获,使用它提供的强大命令体系找出罪魁祸首应该是不成问题的,当然这需要在关机过程中发生蓝屏时softice的驱动还没被卸载掉,否则就需要使用双机进行远程调试了. |
|
板凳#
发布于:2004-02-12 11:39
我写的驱动程序,在系统关机的 时候每次都蓝屏重启。
使用driverworkbench来分析蓝屏信息。 我打开了系统崩溃转储文件.dmp文件,弹出一个标题为System Information的窗口,左边显示以下几项: Fault Information,process List,Driver List ,Device List,Symbolic Link List,IDT,GDT, 只有第一项Fault Information 能显示蓝屏的详细信息,其余都是空白的,到底怎样使用Driverworkbench来通过分析.dmp文件来定位发生蓝屏的驱动代码的具体位置,谁能详细说说使用的步骤,看了Driverworkbench的帮助文件,没看明白。 |
|
|
地板#
发布于:2004-02-12 15:18
程序运行的时候很少蓝屏,当关机的时候,系统显示:保存设置,这时候也没有问题,最后显示正在关机,接下来就显示蓝屏信息,系统马上就重启了。
不知道这时候的蓝屏,用BounderChecker能不能把系统崩溃前的信息给记录下来? |
|
|
地下室#
发布于:2004-02-13 14:44
我用WINDBG来分析蓝屏是产生的.dmp文件,我把蓝屏时产生的.dmp文件首先拷贝到我的机子上(目标系统不便于调试),我首先打开了.dmp文件,接着命令窗口出现了下面的提示:
Loading Dump File [D:\Minidump\Mini011104-01.dmp] Mini Kernel Dump File: Only registers and stack trace are available Symbol search path is: *** Invalid *** **************************************************************************** * Symbol loading may be unreliable without a symbol search path. * * Use .symfix to have the debugger choose a symbol path. * * After setting your symbol path, use .reload to refresh symbol locations. * **************************************************************************** Executable search path is: ********************************************************************* * Symbols can not be loaded because symbol path is not initialized. * * * * The Symbol Path can be set by: * * using the _NT_SYMBOL_PATH environment variable. * * using the -y <symbol_path> argument when starting the debugger. * * using .sympath and .sympath+ * ********************************************************************* Unable to load image ntoskrnl.exe, Win32 error 2 *** WARNING: Unable to verify timestamp for ntoskrnl.exe *** ERROR: Module load completed but symbols could not be loaded for ntoskrnl.exe Windows 2000 Kernel Version 2195 (Service Pack 4) UP Free x86 compatible Kernel base = 0x80400000 PsLoadedModuleList = 0x8046e1b8 Debug session time: Sun Jan 11 16:03:02 2004 System Uptime: not available ********************************************************************* * Symbols can not be loaded because symbol path is not initialized. * * * * The Symbol Path can be set by: * * using the _NT_SYMBOL_PATH environment variable. * * using the -y <symbol_path> argument when starting the debugger. * * using .sympath and .sympath+ * ********************************************************************* ******************************************************************************* * * * Bugcheck Analysis * * * ******************************************************************************* Bugcheck code 0000001E Arguments c0000005 8044fa7d 00000000 00d500b0 ChildEBP RetAddr Args to Child WARNING: Stack unwind information not available. Following frames may be wrong. bfc9c818 0000001e c0000005 8044fa7d 00000000 nt+0x308ad WaitForEvent failed 接着往下我就不知道怎么调试了?看上面这些说明说,缺少符号文件,我的驱动是用DS写的,不存在微软说的那些符号文件,只有.nms为后缀的符号文件,这样的话,是不是不能用WINDBG调试用DS写的驱动了? 如果能的话,具体怎么来操作呢? |
|
|
5楼#
发布于:2004-02-13 22:44
这里所说的缺少符号文件指的是缺少Win2000系统文件的符号文件,诸如ntoskrnl等.在调试前你应该先安装被调试系统(如Win2000)的系统Symbol文件,并用_NT_SYMBOL_PATH 指明路径
|
|
6楼#
发布于:2004-02-16 09:53
SOFTICE能拦截到出现错误的代码,我在我的工控机上安装了SOFTICE。我发现了两个错误:
1,当我点击应用程序菜单上的“停止记录”的时候,按Ctrl+d,在SOFTCIE的屏幕上显示这样的提示: Guard Error :An overrun error occured in memory block f9d56bd0. 请问这是什么错误? 2。当我关机的时候,SOFTICE跳出来显示: Break due to Page Fault(0Eh) .Fault=0000 MSR LastExceptionFromIp=00000000 MSR LastExceptionToIp=00000000 请问这个是什么错误,怎么解决? |
|
|
7楼#
发布于:2004-02-17 21:58
不太好办,softice弹出来的时候,专用寄存器的内容已经清空了,没什么能直接看出来的有用信息。
还是从那个f9d56bd0地址着手吧,看看它落在了你的驱动的哪个部分 |
|
8楼#
发布于:2004-02-18 09:37
如果你有PNP就需要检查PNP的STOP代码,不然就要检查你的UNLOAD代码,同时确保没有未完成的IRP。。。。。
|
|
|
9楼#
发布于:2004-02-18 10:12
如果你有PNP就需要检查PNP的STOP代码,不然就要检查你的UNLOAD代码,同时确保没有未完成的IRP。。。。。 我的驱动运行在WIN2000上,但我得驱动因为是ISA卡得驱动,我写成了内核模式得,不存在PNP得处理。驱动里存在UNLOAD和SHUTDOWN例程,我觉得关机得时候执行的是SHUTWOWN例程,而不是UNLOAD例程,只有人为从设备管理器删除我的设备的时候,UNLOAD例程才执行, 是不是这么回事? 确保没有未完成得IRP,就是要再CLEANUP例程里清除未处理得IRP,Y也应当是这个意思吧? |
|
|
10楼#
发布于:2004-02-25 22:35
不太好办,softice弹出来的时候,专用寄存器的内容已经清空了,没什么能直接看出来的有用信息。 怎么从这个地址找手?? |
|
|