测量Windows中设备驱动程序的内存使用情况

时间:2008-12-27 23:10:33

标签: windows memory-management driver

如何确定每个设备驱动程序消耗的内存量?我假设这可以使用一些Win32或.NET API完成,但我只是无法确定哪个。

2 个答案:

答案 0 :(得分:12)

Windows使用池标记跟踪设备驱动程序内存使用情况。如果您知道有问题的驱动程序传递给ExAllocatePoolWithTag的池标记,那么您可以使用poolmon(来自Windows驱动程序工具包)PoolTag(来自OSR)等工具跟踪其内存使用情况),或WinDbg (or KD)(来自Windows的调试工具)。

请注意,设备驱动程序可能会调用间接分配内存的内核API。例如,调用IoAllocateMdl将使Windows I / O管理器使用由Windows I / O管理器分配的不同池标记为内存描述符列表分配内存。因此,代表多个设备驱动程序执行的分配可能都使用相同的池标记。

如果您正在尝试确定哪个驱动程序正在泄漏内存,请使用poolmon / PoolTag / WinDbg / KD标识正在泄漏的池标记。然后将内核调试器(WinDbg或KD)附加到系统,并将变量nt!poolhittag设置为漏池标记。下一次调用ExAllocatePoolWithTag来分配带有该池标记的内存时,系统将进入内核调试器,然后您可以查看调用堆栈以确定哪个驱动程序正在执行分配。 Using the Kernel Debugger to Find a Kernel-Mode Memory Leak

中详细介绍了此过程

答案 1 :(得分:1)

我知道这不重要。以下是密切相关问题的一些起点:

通过使用VirtualQueryEx来确定PE文件,堆等使用的内存,您可以获得(可能不令人满意)的开始。这是一个提供Virtual memory map视图的程序。这应该回答设备驱动程序的图像大小。

更大的困难在于确定如何标记由分配它的代码动态分配的内存。最好的镜头是使用detours之类的东西来跟踪动态内存分配,然后遍历堆栈以确定orginator。最后,您希望为设备驱动程序执行此操作的事实更进一步。我怀疑绕道可以用于设备驱动程序(虽然我不知道肯定)。我知道从设备驱动程序中走出堆栈非常重要。

您也可以在SysInternals suite中从ProcExp获取所需的数据。运行它转到“系统”,转到查看/显示下方窗格,启用Dll。然后右键单击列标题并添加工作集的标题,例如'WS Total'。我不确定这对于正确标记内存有什么作用。在我的方框中,它为它们提供了设备驱动程序的映射图像大小,但在工作集列中只有0K。我认为procexp缺乏答案作为合理的证据,证明解决这个问题不会很快。

祝你好运。