WinDbg 揪出驱动卸载而没有释放的内存

本文介绍了一种通过启用驱动程序验证程序管理器的池跟踪选项,来定位和解决驱动程序卸载后未释放内存的问题的方法。通过创建一个示例驱动程序并故意引入内存泄漏,文章详细展示了如何触发内存泄漏错误,并利用Windbg进行分析定位。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

标 题: 【原创】揪出驱动卸载而没有释放的内存
作 者: correy
时 间: 2013-07-13,11:33:14
链 接: http://bbs.pediy.com/showthread.php?t=175394

因为以前在工程中解决过,在实际中经常发生,所以有此文,以备终结和以后使用.

先来一个示例的工程,代码如下:
#include <ntifs.h>

#define TAG 'tset' //本驱动在内存中的标志,即test.

DRIVER_UNLOAD Unload;
VOID Unload(__in PDRIVER_OBJECT DriverObject)
{    

}

#pragma INITCODE
DRIVER_INITIALIZE DriverEntry;
NTSTATUS DriverEntry(__in struct _DRIVER_OBJECT * DriverObject, __in PUNICODE_STRING RegistryPath)
{
    NTSTATUS status = STATUS_SUCCESS ;
    PVOID p = 0;

    KdBreakPoint();// == DbgBreakPoint()          

    p = ExAllocatePoolWithTag(NonPagedPool, 9, TAG);
    if (p == NULL) { 
        status = STATUS_UNSUCCESSFUL;
    }    

    DriverObject->DriverUnload = Unload;   
    
    return status;


上面的代码很简单,相信大家都能看出来,如果加载成功将会出现本文的话题.
可是实际上的工程很复杂,可能有几十个文件,每个文件几千行代码.

现在要做的是:即使有代码,先无视代码,或者把代码看的很复杂.

1.加载驱动.
2.启动和配置驱动程序验证程序管理器,这一步一定要配置池跟踪选项,
  详细的可以参考:http://bbs.pediy.com/showthread.php?t=156804
3.重启计算机,重启之前可以查看一下自己刚才的配置.
4.再次加载驱动.
5.如果加载成功,就开始卸载.这时最好双击调试链接上.
  卸载完毕,即Unload函数的代码运行完毕之后,出现蓝屏.以下分析估计也可以适用于内存转储文件.
  蓝屏内容如下:
0: kd> g

*** Fatal System Error: 0x000000c4
                       (0x0000000000000062,0xFFFFFA80059C5C88,0xFFFFFA8004F5A010,0x0000000000000001)

Break instruction exception - code 80000003 (first chance)

A fatal system error has occurred.
Debugger entered on first try; Bugcheck callbacks have not been invoked.

A fatal system error has occurred.

Connected to Windows 7 7601 x64 target at (Sat Jul 13 10:17:30.820 2013 (UTC + 8:00)), ptr64 TRUE
Loading Kernel Symbols
...............................................................
...................................

Press ctrl-c (cdb, kd, ntsd) or ctrl-break (windbg) to abort symbol loads that take too long.
Run !sym noisy before .reload to track down problems loading symbols.

.............................
........
Loading User Symbols
.................................
Loading unloaded module list
.....Unable to enumerate user-mode unloaded modules, Win32 error 0n30
*******************************************************************************
*                                                                             *
*                        Bugcheck Analysis                                    *
*                                                                             *
*******************************************************************************

Use !analyze -v to get detailed debugging information.

BugCheck C4, {62, fffffa80059c5c88, fffffa8004f5a010, 1}

Probably caused by : test.sys

Followup: MachineOwner
---------

nt!DbgBreakPointWithStatus:
fffff800`0167bb90 cc              int     3


按照提示运行!analyze -v命令.
0: kd> !analyze -v
*******************************************************************************
*                                                                             *
*                        Bugcheck Analysis                                    *
*                                                                             *
*******************************************************************************

DRIVER_VERIFIER_DETECTED_VIOLATION (c4)
A device driver attempting to corrupt the system has been caught.  This is
because the driver was specified in the registry as being suspect (by the
administrator) and the kernel has enabled substantial checking of this driver.
If the driver attempts to corrupt the system, bugchecks 0xC4, 0xC1 and 0xA will
be among the most commonly seen crashes.
Arguments:
Arg1: 0000000000000062, A driver has forgotten to free its pool allocations prior to unloading.
Arg2: fffffa80059c5c88, name of the driver having the issue.
Arg3: fffffa8004f5a010, verifier internal structure with driver information.
Arg4: 0000000000000001, total # of (paged+nonpaged) allocations that weren't freed.
  Type !verifier 3 drivername.sys for info on the allocations
  that were leaked that caused the bugcheck.

Debugging Details:
------------------


BUGCHECK_STR:  0xc4_62

IMAGE_NAME:  test.sys

DEBUG_FLR_IMAGE_TIMESTAMP:  51e0b488

MODULE_NAME: test

FAULTING_MODULE: fffff88004c72000 test

VERIFIER_DRIVER_ENTRY: dt nt!_MI_VERIFIER_DRIVER_ENTRY fffffa8004f5a010
Symbol nt!_MI_VERIFIER_DRIVER_ENTRY not found.

DEFAULT_BUCKET_ID:  WIN7_DRIVER_FAULT

PROCESS_NAME:  services.exe

CURRENT_IRQL:  2

LAST_CONTROL_TRANSFER:  from fffff8000176e212 to fffff8000167bb90

STACK_TEXT:  
fffff880`03f31c98 fffff800`0176e212 : 00000000`00000062 fffffa80`054d28f0 00000000`00000065 fffff800`016beb78 : nt!DbgBreakPointWithStatus
fffff880`03f31ca0 fffff800`0176effe : fffffa80`00000003 00000000`00000000 fffff800`016bf3d0 00000000`000000c4 : nt!KiBugCheckDebugBreak+0x12
fffff880`03f31d00 fffff800`01683e44 : 00000000`00000000 fffff880`04c79000 00000000`00000003 00000000`00000000 : nt!KeBugCheck2+0x71e
fffff880`03f323d0 fffff800`01b0c3dc : 00000000`000000c4 00000000`00000062 fffffa80`059c5c88 fffffa80`04f5a010 : nt!KeBugCheckEx+0x104
fffff880`03f32410 fffff800`01b1b54a : 00000000`00000001 00000000`00000000 fffff880`04c72000 00000000`00000001 : nt!VerifierBugCheckIfAppropriate+0x3c
fffff880`03f32450 fffff800`0176fa70 : 00000000`00000000 00000000`00000000 fffff800`017f8e80 00000000`00000000 : nt!VfPoolCheckForLeaks+0x4a
fffff880`03f32490 fffff800`01a352de : fffffa80`059c5bd0 00000000`00000000 00000000`00000000 00000000`00000000 : nt!VfTargetDriversRemove+0x160
fffff880`03f32530 fffff800`01a59d33 : 00000000`00000000 00000000`000e0082 00000000`00000000 00000000`00000001 : nt!VfDriverUnloadImage+0x2e
fffff880`03f32560 fffff800`01a5a1ad : 00000000`00000000 fffffa80`059c5bd0 00000000`00000000 00000000`00010200 : nt!MiUnloadSystemImage+0x283
fffff880`03f325d0 fffff800`01afb6e1 : 00000000`00000000 fffff880`03f328f0 fffffa80`03cfb180 00000000`00000018 : nt!MmUnloadSystemImage+0x4d
fffff880`03f32610 fffff800`0168d004 : 00000000`00000000 fffff880`03f328f0 fffffa80`03cfb180 fffff880`03f328f0 : nt!IopDeleteDriver+0x41
fffff880`03f32640 fffff800`01a6ba3e : fffff880`03f328f0 00000000`00000000 00000000`c0000001 fffff800`00000000 : nt!ObfDereferenceObject+0xd4
fffff880`03f326a0 fffff800`01682fd3 : fffffa80`054d28f0 fffff880`03f328c0 00000000`00000001 fffff980`01450000 : nt!IopUnloadDriver+0x45c
fffff880`03f32870 fffff800`0167f570 : fffff800`01a6b737 00000000`0104e820 00000000`00000001 00000000`00000000 : nt!KiSystemServiceCopyEnd+0x13
fffff880`03f32a08 fffff800`01a6b737 : 00000000`0104e820 00000000`00000001 00000000`00000000 00000000`00cb8f20 : nt!KiServiceLinkage
fffff880`03f32a10 fffff800`01682fd3 : fffffa80`054d28f0 fffff880`03f32c60 00000000`00000000 00000000`00000000 : nt!IopUnloadDriver+0x155
fffff880`03f32be0 00000000`779a2b8a : 00000000`ffb75879 00000000`00341460 00000000`00341460 00000000`00000334 : nt!KiSystemServiceCopyEnd+0x13
00000000`0104e7f8 00000000`ffb75879 : 00000000`00341460 00000000`00341460 00000000`00000334 00000000`0000000a : ntdll!NtUnloadDriver+0xa
00000000`0104e800 00000000`ffb7575a : 00000000`0000000a 00000000`00000000 00000000`0104e970 00000000`00000334 : services!ScUnloadDriver+0xa9
00000000`0104e840 00000000`ffb6118b : 00000000`00000000 00000000`00000020 00000000`00000001 00000000`00240022 : services!ScControlDriver+0x112
00000000`0104e870 00000000`ffb4907b : 00000000`00000001 00000000`0104ede0 00000000`00000000 000007fe`00000000 : services!ScControlService+0x192
00000000`0104e940 000007fe`ff5a23d5 : 00000000`00000003 00000000`0104edf8 00000000`0104ef40 000007fe`ff5a2396 : services!RControlService+0x4b
00000000`0104e9b0 000007fe`ff5969b2 : 00000000`0104ede0 00000000`ffb80192 00000000`00000020 00000000`ffb7ed54 : RPCRT4!Invoke+0x65
00000000`0104ea10 000007fe`ff59338d : 00000000`0104f120 00000000`00000000 00000000`00000000 00000000`00000000 : RPCRT4!NdrStubCall2+0x32a
00000000`0104f030 000007fe`ff5950f4 : 00000000`00000000 00000000`00000001 00000000`00000000 00000000`003ea9c0 : RPCRT4!NdrServerCall2+0x1d
00000000`0104f060 000007fe`ff594f56 : 00000000`00000000 00000000`003e1680 00000000`0104f210 00000000`003d2090 : RPCRT4!DispatchToStubInCNoAvrf+0x14
00000000`0104f090 000007fe`ff595679 : 00000000`00361878 000007fe`ff58a9df 00000000`00000308 00000000`003ea870 : RPCRT4!RPC_INTERFACE::DispatchToStubWorker+0x146
00000000`0104f1b0 000007fe`ff59532d : 00000000`00369a00 00000000`0125e8d0 000007fe`ff570000 00000000`0034e920 : RPCRT4!LRPC_SCALL::DispatchRequest+0x149
00000000`0104f290 000007fe`ff5b2e7f : 00000000`00000000 00000000`0034a820 00000000`00000000 00000000`00000001 : RPCRT4!LRPC_SCALL::HandleRequest+0x20d
00000000`0104f3c0 000007fe`ff5b2a35 : 00000000`ffb57f48 00000000`00000000 00000000`0034a920 00000000`00000000 : RPCRT4!LRPC_ADDRESS::ProcessIO+0x3bf
00000000`0104f500 00000000`7796b68b : 00000000`00000048 00000000`00000001 00000000`00000000 00000000`00000000 : RPCRT4!LrpcIoComplete+0xa5
00000000`0104f590 00000000`7796feff : 00000000`00000000 00000000`00000000 00000000`0000ffff 00000000`00000000 : ntdll!TppAlpcpExecuteCallback+0x26b
00000000`0104f620 00000000`7774652d : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : ntdll!TppWorkerThread+0x3f8
00000000`0104f920 00000000`7797c521 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : kernel32!BaseThreadInitThunk+0xd
00000000`0104f950 00000000`00000000 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : ntdll!RtlUserThreadStart+0x1d


STACK_COMMAND:  kb

FOLLOWUP_NAME:  MachineOwner

FAILURE_BUCKET_ID:  X64_0xc4_62_VRF_LEAKED_POOL_IMAGE_test.sys

BUCKET_ID:  X64_0xc4_62_VRF_LEAKED_POOL_IMAGE_test.sys

Followup: MachineOwner
---------

上面说:
Arg2: fffffa80059c5c88, name of the driver having the issue.
输入:db fffffa80059c5c88
0: kd> db fffffa80059c5c88
fffffa80`059c5c88  74 00 65 00 73 00 74 00-2e 00 73 00 79 00 73 00  t.e.s.t...s.y.s.
fffffa80`059c5c98  00 00 00 00 00 00 00 00-0e 00 36 02 43 63 56 70  ..........6.CcVp
fffffa80`059c5ca8  60 5b 9c 05 80 fa ff ff-a0 b2 cb 03 80 fa ff ff  `[..............
fffffa80`059c5cb8  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fffffa80`059c5cc8  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fffffa80`059c5cd8  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fffffa80`059c5ce8  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fffffa80`059c5cf8  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
果然不错.

再看:Arg3: fffffa8004f5a010, verifier internal structure with driver information.
估计这是一个结构,啥结构暂时没有深入查看.
不过windbg帮助文档说这个参数:Reserved.

再看:Arg4: 0000000000000001, total # of (paged+nonpaged) allocations that weren't freed.
这个是申请而没有释放的次数(包含分页的和不分页的),不是内存大小.

接下来就是乖乖的运行:
Type !verifier 3 drivername.sys for info on the allocations
  that were leaked that caused the bugcheck.
的提示.
0: kd> !verifier 3 test.sys

Verify Level fbf ... enabled options are:
  Special pool
  Special irql
  Inject random low-resource API failures
  All pool allocations checked on unload
  Io subsystem checking enabled
  Deadlock detection enabled
  DMA checking enabled
  Security checks enabled
  Force pending I/O requests
  IRP Logging
  Miscellaneous checks enabled

Summary of All Verifier Statistics

RaiseIrqls                             0x0
AcquireSpinLocks                       0x0
Synch Executions                       0x0
Trims                                  0x24d9

Pool Allocations Attempted             0x2757b
Pool Allocations Succeeded             0x2757b
Pool Allocations Succeeded SpecialPool 0x2757b
Pool Allocations With NO TAG           0x0
Pool Allocations Failed                0x0
Resource Allocations Failed Deliberately   0x0

Current paged pool allocations         0x0 for 00000000 bytes
Peak paged pool allocations            0x0 for 00000000 bytes
Current nonpaged pool allocations      0x1 for 0000000C bytes
Peak nonpaged pool allocations         0x1 for 0000000C bytes

Driver Verification List

Entry     State           NonPagedPool   PagedPool   Module

fffffa8003c2f740 Loaded           0000000c       00000000    test.sys

Current Pool Allocations  00000001    00000000
Current Pool Bytes        0000000c    00000000
Peak Pool Allocations     00000001    00000000
Peak Pool Bytes           0000000c    00000000

PoolAddress  SizeInBytes    Tag       CallersAddress
fffff9800933eff0     0x0000000c     test      fffff88004c73043


可以看到:
Peak Pool Allocations     00000001    00000000
Peak Pool Bytes           0000000c    00000000

PoolAddress  SizeInBytes    Tag       CallersAddress
fffff9800933eff0     0x0000000c     test      fffff88004c73043

关于内存标志的提示:
有的标志本驱动没有定义,却出现在本驱动中,这些标志是系统定义的,使用不当造成的.
例如:RtlConvertSidToUnicodeString,RtlAnsiStringToUnicodeString,RtlUnicodeStringToAnsiString等.
不过这些内存的标记,我忘记了.

这里只做非分页的内存泄漏,没有做分页内存的演示.
有一次没有释放,申请的内存的大小是12.

看一下:
0: kd> db fffff9800933eff0
fffff980`0933eff0  d7 d7 d7 d7 d7 d7 d7 d7-d7 d7 d7 d7 d7 d7 d7 d7  ................
fffff980`0933f000  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????
fffff980`0933f010  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????
fffff980`0933f020  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????
fffff980`0933f030  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????
fffff980`0933f040  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????
fffff980`0933f050  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????
fffff980`0933f060  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????
好像是16个字节.

0: kd> u fffff88004c73043
test!DriverEntry+0x33 [e:\driver\test\test.c @ 20]:
fffff880`04c73043 4889442428      mov     qword ptr [rsp+28h],rax
fffff880`04c73048 48837c242800    cmp     qword ptr [rsp+28h],0
fffff880`04c7304e 7508            jne     test!DriverEntry+0x48 (fffff880`04c73058)
fffff880`04c73050 c7442420010000c0 mov     dword ptr [rsp+20h],0C0000001h
fffff880`04c73058 488b442440      mov     rax,qword ptr [rsp+40h]
fffff880`04c7305d 488d0d1c000000  lea     rcx,[test!Unload (fffff880`04c73080)]
fffff880`04c73064 48894868        mov     qword ptr [rax+68h],rcx
fffff880`04c73068 8b442420        mov     eax,dword ptr [rsp+20h]

注意这一步要正确的加载符号文件.
看到了吧!
就是e:\driver\test\test.c文件的第20行申请的内存没有释放.

至此分析完毕,具体的解决办法我就不说了,相信你是知道的.

总结和心得:
解决问题,需要思路和方法,方法和思路是动脑子想出来的,我无人可问,其次是查询和搜索.
如果没有思路和方法,无头苍蝇的乱转,转了很长时间是没有收获和进展的.
如果你会了,其实这也很简单的.

关于没有源码的驱动卸载后仍在系统中的内存另论.
关于运行过程中的内核的内存泄漏,可以参考:http://bbs.pediy.com/showthread.php?t=154015


made by correy
made at 2013.07.13
email:kouleguan at hotmail dot com
homepage:http://correy.webs.com

书于匆忙之中,如果不当之处,敬请指出. 
<think>我们正在讨论如何使用WinDbg分析dump文件来排查驱动相关的问题。根据引用内容,我们知道WinDbg是一个强大的调试工具,特别适合分析内核模式的问题(如驱动问题)。以下是步骤指南: 1. **准备环境**: - 安装WinDbg(建议最新版本,可从Microsoft Store或Windows SDK中获取)。 - 配置符号路径(Symbol Path):驱动调试需要正确的符号文件(.pdb)。设置符号路径为: - 微软公有符号服务器:`SRV*C:\Symbols*http://msdl.microsoft.com/download/symbols` - 以及你自己的驱动符号路径。 -WinDbg中通过`File` > `Symbol File Path`设置,或使用命令:`.sympath srv*C:\Symbols*http://msdl.microsoft.com/download/symbols; C:\YourDriverSymbols` 2. **打开dump文件**: - 启动WinDbg,通过`File` > `Open Crash Dump`选择dump文件(通常扩展名为.dmp)。 - 或者使用命令行:`windbg -y "SymbolPath" -i "ImagePath" -z "DumpFile.dmp"` 3. **基本命令分析**: - 加载dump文件后,WinDbg会自动执行初始分析。但我们可以手动执行一些命令: - `!analyze -v`:这是最重要的命令,它会自动分析崩溃原因,并给出可能的原因和堆栈跟踪。 - `lm`:查看已加载的模块,确认驱动是否已加载。 - `!drivers`:显示所有已加载的驱动,查看目标驱动的信息。 - `kv`:显示当前线程的调用堆栈(stack trace)。 - 如果`!analyze`已经指出问题,比如某个驱动导致的崩溃(通常以`DRIVER_IRQL_NOT_LESS_OR_EQUAL`等错误代码表示),则重点关注该驱动。 4. **驱动问题特定分析**: - 如果崩溃发生在驱动中,我们可以使用以下命令进一步分析: - `!irp <address>`:查看指定的IRP(I/O Request Packet)结构,驱动中经常处理IRP。 - `!devstack <device object address>`:显示设备堆栈,用于分析设备对象和附加的驱动- `!devobj <device object address>`:查看设备对象的信息。 - `!stacks`:显示所有线程的堆栈,有助于发现死锁等问题。 - `!thread`:显示当前线程的信息,包括IRQL(中断请求级别)和等待状态。 - `!poolused`:检查内存池使用情况,驱动中的内存泄漏或池破坏问题常导致崩溃。 5. **常见驱动问题场景**: - **内存破坏**:使用`!poolval`检查内存池,或使用`!verifier`(如果启用了驱动验证器)来检查违规。 - **IRQL问题**:在驱动中,当IRQL过高时执行了不允许的操作(如分页内存访问)会导致崩溃。通过`!irql`或`!thread`查看当前IRQL。 - **死锁**:使用`!locks`查看当前持有的锁,结合`!stacks`查看线程堆栈,分析是否有循环等待。 6. **高级分析**: - 如果基本分析无法确定问题,可能需要: - 使用`dt`(显示类型)命令查看具体数据结构。 - 反汇编:`u <address>`反汇编指定地址的代码。 - 设置断点(虽然dump是静态的,但可以查看代码位置):`bp <address>`(但注意在dump中无法真正执行,通常用于查看断点是否在关键位置)。 - 分析内存:`dd <address>`显示内存内容。 7. **使用扩展命令**: - WinDbg有很多扩展命令,如用于网络驱动的`ndiskd`,用于USB的`usbkd`等。根据驱动类型,加载相应的扩展。 8. **生成分析报告**: - 使用`.logopen`命令记录分析过程,然后执行命令,最后用`.logclose`关闭。 9. **参考建议**: - 如果驱动问题难以定位,可以考虑启用驱动验证器(Driver Verifier)来重现问题并捕获更多信息[^2]。 - 对于生产环境的问题,确保收集到的是完整内存转储(Full Memory Dump)或内核内存转储(Kernel Memory Dump),以便获得足够的信息。 通过以上步骤,我们可以利用WinDbg分析dump文件来定位驱动问题。下面是一个简单的示例流程: 示例: 1. 打开dump文件。 2. 运行`!analyze -v`,输出显示崩溃原因是`DRIVER_IRQL_NOT_LESS_OR_EQUAL`,且崩溃的驱动模块为`faulty_driver.sys`。 3. 使用`kv`查看崩溃时的堆栈,发现是在`faulty_driver!SomeFunction+0x123`中。 4. 使用`u faulty_driver!SomeFunction+0x123`反汇编,查看具体指令。 5. 结合代码上下文,分析可能的原因(如访问了非法地址)。 注意:驱动调试通常需要熟悉操作系统内核和驱动开发知识。 §§ 相关问题 §§ 1. 如何配置WinDbg的符号路径? 2. 驱动验证器(Driver Verifier)如何使用? 3. 如何生成内核模式的dump文件? 4. 常见的驱动崩溃错误代码有哪些?</think>### 使用WinDbg分析Dump文件排查驱动问题指南 #### 一、准备工作 1. **安装WinDbg**: - 从Microsoft Store安装最新版WinDbg Preview[^2] - 或通过Windows SDK安装经典版WinDbg ```powershell # PowerShell安装命令 winget install Microsoft.WinDbg ``` 2. **配置符号路径**(关键步骤): ```windbg .sympath srv*C:\Symbols*https://msdl.microsoft.com/download/symbols .reload ``` - 添加驱动厂商提供的私有符号路径(如有)[^2] 3. **准备Dump文件**: - 内核模式Dump:位于`C:\Windows\Minidump`(蓝屏产生) - 用户模式Dump:通过任务管理器生成(右键进程→"创建转储文件")[^4] --- #### 二、驱动问题分析流程 1. **加载Dump文件**: ```windbg File → Open Crash Dump → 选择.dmp文件 ``` 2. **执行初步分析**: ```windbg !analyze -v // 自动分析崩溃原因 ``` - 重点关注: - `BUGCHECK_CODE`(蓝屏代码) - `FAILED_INSTRUCTION_ADDRESS`(故障指令地址) - `PROCESS_NAME`(关联进程)[^3] 3. **检查驱动状态**: ```windbg !drivers // 列出所有加载的驱动 lm v m <驱动名> // 查看特定驱动详情 !irql // 检查中断请求级别 ``` 4. **分析调用栈**: ```windbg k // 显示当前线程栈 !thread // 查看线程信息 .reload /i // 强制加载符号 ``` 5. **检查内存和对象**: ```windbg !poolused // 显示内存池使用 !object \Driver // 查看驱动对象 !devobj <设备对象地址> // 检查设备对象 ``` --- #### 三、常见驱动问题诊断 1. **内存违规访问**: ```windbg !pte <故障地址> // 检查页表项 !pool <地址> // 检查内存池 ``` 2. **IRQL冲突**: ```windbg !irql !stacks // 检查所有线程栈 ``` 3. **死锁检测**: ```windbg !locks // 显示所有锁 !deadlock // 检测死锁(需安装扩展) ``` 4. **IRP跟踪**: ```windbg !irp <IRP地址> // 查看I/O请求包 !devstack <设备对象> // 查看设备栈 ``` --- #### 四、高级技巧 1. **时间旅行调试**(需TTD记录): ```windbg .ttd // 加载时间旅行记录 !tt <时间点> // 跳转到特定时间 ``` 2. **脚本自动化分析**: ```windbg $$ 创建分析脚本(.txt文件) $$>a< myscript.txt ``` 3. **扩展命令使用**: ```windbg .load kdexts // 加载内核扩展 !drvobj <驱动对象> 2 // 详细驱动分析 ``` --- #### 五、最佳实践 1. **配置建议**: - 启用完整内存转储:`控制面板→系统→高级→启动和故障恢复` - 定期更新符号文件:`.sympath+ c:\mysymbols` 2. **调试技巧**: ```windbg .logopen c:\debuglog.txt // 记录调试会话 .cordll -ve -u -l // 强制加载CLR调试扩展 ``` 3. **常见驱动错误代码**: | 错误代码 | 含义 | 常见原因 | |----------|-----------------------|------------------| | 0x3B | SYSTEM_SERVICE_EXCEPTION | 驱动未处理异常 | | 0xD1 | DRIVER_IRQL_NOT_LESS_OR_EQUAL | IRQL违规操作 | | 0xC2 | BAD_POOL_CALLER | 内存池操作错误 | > 提示:驱动问题分析需结合代码上下文,建议使用`u <地址>`反汇编故障点附近指令[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值