在内核中发生内存泄露时,一般利用pool tag定位内存泄露的地方。步骤如下:
1. 首先要启用pool tag,对于xp系统,可以利用gflag工具启用pool tag并重启计算机。对于之后的操作系统,pool tag默认启用。
2. 若使用windbg内核调试,可以使用!poolused指令列出当前核心内存的使用情况,并聚焦于指定的tag。
3. 可以使用内核调试器编辑nt!poolhittag变量,当从nt!poolhittag分配内存时,系统可以中断,此时可以查看调用堆栈,分析问题。例如
kd> ed nt!poolhittag 'Dlek',若要取消监视,kd> ed nt!poolhittag 0即可。
4. 还可以使用工具poolmon查看核心内存使用情况。只需双击运行即可,使用方便。
5. 若找到了导致内存泄露的pool tag,却不知道是哪个驱动时,可以使用以下命令
C:\>findstr /s Leak *.sys
Users\Administrator\Desktop\myfault.sys:
AìI♦A╕Leak;┴☼B┴Aì
·∟ §£♂ Θ─☺ A╗☻ E☼"├Θ╡☺ Hï♣╔♂ ╞ $Θª☺ Hï♣:Hc┴ ┴ê\♦@ë
└δ_Aï ╞♣@∟ ☺ë♣▓← Aï@♦ë♣¼← δCAâ∙♦u╓AïAìI♦A╕Leak;┴☼B┴3╔ï╨ §
另外在windbg中可以使用以下命令
1: kd> !for_each_module s -a @#Base @#End "Leak"
fffff880`044b63aa 4c 65 61 6b 3b c1 0f 42-c1 41 8d 49 fd 8b d0 ff Leak;..B.A.I....
fffff880`044b6621 4c 65 61 6b 3b c1 0f 42-c1 33 c9 8b d0 ff 15 cc Leak;..B.3......
1: kd> lm a fffff880`044b63aa
start end module name
fffff880`044b5000 fffff880`044bc000 myfault (no symbols)
1: kd> lm a fffff880`044b6621
start end module name
fffff880`044b5000 fffff880`044bc000 myfault (no symbols)
PS:技巧5 出自ntdebugging。