用poolmon来查找内存泄露
poolmon C:\WinDDK\7600.16385.1\tools\Other\i386\poolmon.exe
gflags C:\WinDDK\7600.16385.1\Debuggers\gflags.exe
[步骤]:
1).修改注册表
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager
GlobalFlag 0x000400
2).gflags.exe
勾选 Enable pool tagging
3).重启系统
4).打开poolmon 看到详细的内存分配释放信息
P - 切换分页非分页内存
D - 按分配与未释放的差来排列
5).设置命令行窗口
右键 - 属性 - 选项 - 编辑选项 - 勾选快速编辑模式
还可以把缓冲区大小调大点
6).鼠标左键选择全部内容,回车
7).打开记事本,CTRL+V
Memory: 3136424K Avail: 2672512K PageFlts: 2504 InRam Krnl: 2864K P:58704 Commit: 305964K Limit:5065664K Peak: 598068K Pool N:14872K P:63108 Tag Type Allocs Frees Diff Bytes Per Alloc NtFs Paged 22354 ( 0) 16458 ( 0) 5896 310656 ( 0) 52 MmSt Paged 8892 ( 3) 3049 ( 25) 5843 11600216 (-17480) 198 CMVa Paged 497244 ( 243) 491734 ( 155) 5510 275648 ( 3528) 50 Ntf0 Paged 39087 ( 32) 33784 ( 32) 5303 184280 ( 0) 34 MmSm Paged 5049 ( 0) 456 ( 0) 4593 293952 ( 0) 64 FSim Paged 3971 ( 0) 61 ( 0) 3910 500480 ( 0) 128 IoNm Paged 400361 ( 645) 396911 ( 723) 3450 501632 ( -7424) 145 NtfF Paged 3430 ( 0) 727 ( 0) 2703 2551632 ( 0) 944 Ntfo Paged 31970 ( 64) 29291 ( 64) 2679 267424 ( 0) 99 Ntff Paged 10264 ( 0) 7616 ( 0) 2648 2203136 ( 0) 832 CMNb Paged 565888 ( 224) 563791 ( 272) 2097 117432 ( -2024) 56 CMDa Paged 58237 ( 27) 56171 ( 45) 2066 259568 ( -1464) 125 Sect Paged 53359 ( 206) 51324 ( 229) 2035 177640 ( -2072) 87 CMVI Paged 69712 ( 36) 68199 ( 75) 1513 53048 ( -112) 35 NtFL Paged 1426 ( 1) 0 ( 0) 1426 57040 ( 40) 40 Ntfc Paged 3789 ( 73) 2384 ( 97) 1405 101160 ( -1728) 72 SYSA Paged 6191 ( 0) 4871 ( 0) 1320 152056 ( 0) 115 ......
这样,通过连续多次记录相隔一定时间的poolmon输出信息并比较它们的差别,可以找出存在内存泄露的程序
[参考资料]:
http://support.microsoft.com/kb/177415/zh-cn
http://blog.csdn.net/moreorless/article/details/3369525