我怎么能确定有多少存储每个装置驱动程序耗费?我假设这是可以做到的一些Win32。净API,但我只是还没有能够确定哪一个。

有帮助吗?

解决方案

我知道这是不平凡的。这里有一些起点密切相关的问题:

你可以获得(很可能不能令人满意的)开始使用 VirtualQueryEx 确定所使用的存储器的PE文件,堆,等等。这是一个程序,提供了一个 虚拟存储的地图 图。这应该回答的图像大小的装置驱动程序。

较大困难在于确定如何标签的存储器,是动态的分配代码,这是分配。更好的枪没用的东西喜欢 弯路 跟踪的动态存储器中拨款作为它们是由走堆确定orginator.最后事实上,你想做这种设备的司机需要更进一步。我怀疑弯路可以使用设备司机(虽然我不知道肯定的).我不知道走堆从一个装置驱动程序是非常不平凡的。

你可能还能得到你想要的数据,从ProcExp在 微软套房.运行它去的"系统",去查看/显示较低的格,启用Dll。然后右击栏标题和增加的工作组如'WS总'.我不确定这样做的正确的标签,他们的存储器。在我的箱子,这使他们的映射图像大小的装置驱动程序,但只有0K在工作组列。我把缺乏一个答案从procexp作为合理证据表明,解决这个问题不会单元。

好运气。

其他提示

窗户跟踪装置驱动器的存储器的使用泳池的标签。如果你知道什么样的游泳池标签的司机通行证的问题 ExAllocatePoolWithTag, 然后您可以跟踪它的存储器中使用的工具,如使用 poolmon (从窗户驱动程序工具包), PoolTag (从系统),或 WinDbg(或科威特第纳尔) (从调试工具,用于Windows)。

注意设备的司机可调用核Api,间接分配的记忆。例如,叫 IoAllocateMdl 将导致Windows I/O管理,分配内存存储器的描述的列表中,使用不同的游泳池的标签,分配由Windows I/O管理。由于这个原因,分配执行代表多个装置驱动程序可能都使用同一游泳池的标签。

如果你试图确定哪些驱动程序是漏水的存储器,使用poolmon/PoolTag/WinDbg/KD确定池的标记(s)被泄露。然后附加一个内核debugger(WinDbg或科威特第纳尔)的系统和设置变量 nt!poolhittag 到漏水池的标签。下一次 ExAllocatePoolWithTag 被称为分配存与这一游泳池的标签,该系统将打破成的核心调试器,然后你可以看看电话堆,以找出哪些驱动程序进行分配。这一过程中更详细地描述 使用核调试器,以找到一个核心模式存储器泄漏.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top