如何确定每个设备驱动程序消耗的内存量?我假设这可以使用一些Win32或.NET API完成,但我只是无法确定哪个.
Windows使用池标记跟踪设备驱动程序内存使用情况 如果您知道有问题的驱动程序传递给哪些池标记ExAllocatePoolWithTag
,那么您可以使用诸如poolmon
(来自Windows驱动程序工具包),PoolTag(来自OSR)或WinDbg(或KD)(来自调试工具)等工具来跟踪其内存使用情况.视窗).
请注意,设备驱动程序可能会调用间接分配内存的内核API.例如,调用IoAllocateMdl
将使Windows I/O管理器使用由Windows I/O管理器分配的不同池标记为内存描述符列表分配内存.因此,代表多个设备驱动程序执行的分配可能都使用相同的池标记.
如果您正在尝试确定哪个驱动程序正在泄漏内存,请使用poolmon/PoolTag/WinDbg/KD标识正在泄漏的池标记.然后将内核调试器(WinDbg或KD)附加到系统并将变量nt!poolhittag
设置为漏池标记.下一次ExAllocatePoolWithTag
调用为该池标记分配内存,系统将进入内核调试器,然后您可以查看调用堆栈以确定哪个驱动程序正在执行分配.在使用内核调试器查找内核模式内存泄漏中更详细地描述了此过程.