永发信息网

谁在使用池?

答案:1  悬赏:0  手机版
解决时间 2021-04-02 12:43
谁在使用池?
最佳答案
池标记是一个与内存位置关联的四字符文字。通过监视与特定标记关联的分配,您可以找出哪些组件在分配内存,更重要的是,哪些组件忘记释放它们分配的内存从而导致内存泄漏。在驱动程序中指定池标记。驱动程序在使用 ExAllocatePoolWithTag、ExallocatePoolWithTagPriority 和ExAllocatePoolWithQuotaTag 从内核模式池分配分页或未分页、缓冲的内存时指定池标记。(微型驱动程序使用这些例程的类驱动程序的版本,例如用于 NDIS 微型端口驱动程序的 NdisAllocateMemoryWithTag。)例如,下面的代码片段从缓冲区对齐的未分页池分配一个缓冲区并将池标记 MyBf 与分配关联。ExAllocatePoolWithTag 调用中的池标记按逆序指定,从而使标记在调试器和工具输出中正确显示。MyBuffer = ExAllocatePoolWithTag(NonPagedPoolCacheAligned, MAX_BUFFER_SIZE, 'fByM');池内存保持已分配状态直到驱动程序释放它,因此驱动程序必须调用 ExFreePool 或ExFreePoolWithTag(对于微型驱动程序,调用与类驱动程序等效的例程)来取消对使用任何 ExAllocatePoolXxx 例程分配的所有内存的分配。如果您使用 ExFreePoolWithTag,那么提供的标记必须匹配用来分配内存的标记;否则,系统会生成错误检查 0xC2 BAD_POOL_CALLER。指定池标记时,使用唯一的标记来区分您的驱动程序与系统中的其他驱动程序。(本技巧稍后将描述的文件 Pooltag.txt 列出了其他驱动程序和 Windows 组件使用的已知标记。)另外,确保使用字符文字 ('fByM') 而不是字符串文字 ("fByM")。字符文字作为常量 ULONG 处理,而字符串文字作为常量指针处理,因此使用字符串文字作为标记会导致编译驱动程序时产生类型不匹配错误。驱动程序编写人员应决定驱动程序使用多少标记。小型、简单的驱动程序可能只有单个唯一标记,而更大型、复杂的驱动程序可能针对每种分配都有不同的唯一标记。在使用 Driver Verifier 的“特殊池”选项时,在大型驱动程序中使用多个池标记特别有用,因为它降低了使用特定标记的分配将耗尽特殊池的可能性。与池标记相关的常见错误包括使用字符串文字而不是字符文字、提供池标记失败或使用当前版本 Windows 上废弃的默认池标记。带有驱动程序特定规则的 PREfast 是 Windows DDK 提供的静态源代码分析工具,可以帮助查找驱动程序源代码中的这些错误和其他类型的错误。关于 PREfast 的更多信息,请参见本技巧的末尾部分。通过池标记检查分配。 池标记在故障转储中进行报告,并且可以使用内核调试器或诸如 Driver Verifier 和 Poolmon 等其他工具(这些工具在内存分配统计信息中显示池标记)来查看。只有在池标记启用后系统才为内存分配打上标记(即使您使用 ExAllocatePoolWithTagXxx 来指定标记也是如此)。池标记在 Windows Server 2003 和更高版本的 Windows 上是永久启用的。对于 Microsoft Windows XP 和早期版本的 Windows,您必须首先使用 Windows 调试工具提供的全局标志实用工具(Gflags)来启用池标记。启用池标记之后,您可以使用下列方法之一检查由池标记进行的分配:内核调试器扩展。使用调试器扩展 !pool、!poolfind 和!poolused 来显示内存分配统计信息、在分页或未分页池内存中搜索特定池标记的实例,以及显示每个池分配的池标记的内存使用统计。使用调试器扩展 !verifier 0x3 在驱动程序被卸载后定位未决的内存分配,或者在驱动程序运行期间跟踪分配。这个扩展显示池标记、池大小和分配内存的函数地址。这些调试器扩展包含在 Windows 调试工具包中,这个工具包包含调试器、其他调试工具和文档。Driver Verifier。使用Driver Verifier 的“特殊内存池”选项从特殊池(未分页池的一个有限区域,可以用来监视错误访问的分配)中分配标记为特定池标记的内存。在使用这个选项激活 Driver Verifier 之前,使用 GFlags 来指定标记。Driver Verifier 随 Windows 提供,在 Windows DDK 中有相关的文档。Poolmon。在系统运行期间使用 Poolmon (Memory Pool Monitor) 来监视驱动程序和系统组件进行的内存分配。(Pooltag 实用工具是这个工具基于 GUI 的子集,也由 Windows DDK 提供。)Poolmon 和 Pooltag 由 Windows DDK 提供。Windows Server 2003 SP1 的 Windows DDK 文档包含几个使用 Poolmon 的详细示例,包括如何检测内存泄漏。请参见本提示结束处的资源,以了解可从哪里获得 Windows 调试工具和 Windows DDK。那是谁的标记?文件Pooltag.txt 列出Windows 提供的内核模式组件和驱动程序使用的池标记、关联文件或组件(如果已知)和组件的名称。Pooltag.txt 随Windows 调试工具(在 %windbg%\triage 中)和 Windows DDK(在 %winddk%\tools\other\platform\poolmon 中)安装,其中 platform 是amd64、i386 或 ia64)。您可以在文件中搜索特定的标记来找出标记的所有者。下面的例子显示来自 Pooltag.txt 的一些代码行:8042 - i8042prt.sys - PS/2 kb and mouse ARPC - atmarpc.sys - ATM ARP Client ATMU - atmuni.sys - ATM UNI Call Manager Atom - - Atom Tables Abos - - Abiosdsk如果您在查找的标记未在 Pooltag.txt 中,那么您可能能够通过使用下列技术之一找到其所有者:对于32 位版本的 Windows,使用 poolmon /c 来创建一个本地标记文件,列出由本地机器上的驱动程序 (%SystemRoot%\System32\Drivers\*.sys) 指定的每个标记值。这个文件的默认名称是 Localtag.txt。对于Windows 2000 和 Windows NT 4.0,使用“搜索”来查找包含特定池标记的文件(在 KB298102“ 如何查找第三方驱动程序使用的池标记”中说明).您应该做什么?指定池标记时,使用唯一的标记来区分您的驱动程序与系统中的其他驱动程序。确保为您的标记使用字符文字而不是字符串文字。如果您正在编写微型驱动程序,那么使用类驱动程序提供的内存分配例程,而不要使用 ExAllocatePoolWithTagXxx 例程。记住释放池内存,如果您使用 ExFreePoolWithTag(或微型驱动程序的等价物),那么请提供与分配内存时使用的相同标记。在您的驱动程序源代码上使用带有驱动程序特定规则的 PREfast。要在Windows XP 和早期的 Windows 版本上调试内存分配,请首先使用 Gflags 实用程序来启用池标记。在您的驱动程序中调试内存分配时,使用本文中描述的内核调试器扩展和工具来使用池标记。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
现代悦动的尾灯能单独拆下来么、在不卸后包围
为什么篮球三分线距离中场线比较远而距离边线
巫溪最近的火车站
上海嘉定区慈竹路福莱锦苑属上海哪个镇?
星球针织机械配件商行在哪里啊,我有事要去这
求《你想干什么》[完结+番外]|txt 作者:幽篁
临沂至西藏火车路线
想要抬高鼻梁,找杜建龙做?
256-3分之256等于?
我家有棵榆树,胸径1米左右,树龄60年以上,
求TVB《水浒无间道》国语版全集资源,谢谢!
手机QQ给其中一个好友发信息发不出去,用电脑
有关 ecshop 属性 {$goods.goods_attr|nl2br}
要学犯罪心理学 上哪个大学比较好
550千克+638千克等于多少
推荐资讯
汉鼎鱼竿算不算杂牌
投资一家港式烧仙草店需要多少钱
油耗6.9,实际油耗多少
武汉大学分子生物学怎么做
请大神帮忙看看这个八字怎么样:乙丑辛巳丙辰
保险公司车险理赔费用超出10000会影响第二年
如何在Erlang中操作Redis
希腊移民究竟哪里好,为什么这么多人想移民希
不可否认的一点是 央视老版四大名著里 水浒是
幼小衔接班上6个月的好还是上两个月的好
比较cos36与cos25值的大小
抚州市临川区嵩湖乡会大开发吗
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?