用poolmon定位内存泄漏

2024-02-19 19:38:36 浏览数 (1)

文档主要是演示下poolmon的命令用法,仅此而已,文档里贴的360那个示例仅仅是示例而已,我是故意选了360的模块占用,来展示命令的作用,仅此而已。

在更多内存泄露场景中,poolmon并不大能定位到根因。最好用的反而是排除法和对比法,性能对比,从原理上来讲,我一直是奉行这句要诀: 环境一致性[底层硬件/操作系统/软件/工作负载(请求量/包量等)],测试要尽量消除无关变量,如果没有正常环境做参考,那就排除法,从这2个主要维度分细节去对比排除。

代码语言:javascript复制
平台侧:硬件配置差异、虚拟化差异、安全组差异
系统内部:winver内核版本、驱动版本、补丁、软件版本和关键文件md5值、服务列表、平台组件

poolmon集成在wdk里,需要运行wdksetup.exe进行安装,而windbg也需要运行wdksetup.exe进行安装,但是请注意wdksetup.exe不含Windows Performance Toolkit,不要搞混了。

先介绍如何安装poolmon,然后介绍怎么用

打开https://docs.microsoft.com/zh-cn/windows-hardware/drivers/download-the-wdk

1、下载安装wdk

注意直接点步骤3里的链接下载wdksetup.exe

https://go.microsoft.com/fwlink/?linkid=2166289

运行wdksetup.exe下载安装文件到一个目录

下载完成后关闭界面

然后去下载完成的目录(留存安装文件是为了在多台机器部署,压缩后复制到其他机器就可以用,而不用再下载一次),找到这个目录里的wdksetup.exe运行安装

2、cd /d "poolmon的绝对路径目录"

poolmon.exe的位置C:Program Files (x86)Windows Kits10Toolsx64poolmon.exe

cd /d "C:Program Files (x86)Windows Kits10Toolsx64"

3、执行poolmon命令

-n 是输出文件

-u或-b 是按Bytes倒序排列

-p -p 就是按2次p,即 First turns on nonpaged, second turns on paged

poolmon.exe -n c:1.txt -u -p -p(按2次p,paged)

poolmon.exe -n c:2.txt -u -p(按1次p,nonpaged)

poolmon -n c:3.txt -u (混合)

用notepad 打开上面获取到的.txt(软件作者反华,软件本身挺好用,会对齐列),看Bytes排在前边的Tag(多试几个Tag)

4、注意上图第1条的Bytes一列是倒序的,看前几条的第一列Tag名称

5、执行cd /d "C:WindowsSystem32drivers"

findstr /m /l /s $tagname *.sys

对应到上图即

findstr /m /l /s MmSt *.sys

findstr /m /l /s Se *.sys

findstr /m /l /s FMfn *.sys

根据查到的关键词可以判定占用内存最多的是什么软件,我自己这个case中,主要是操作系统占用的

6、假如Bytes一列最大值对应的Tag名称是DRPI,那执行findstr /mls DRPI *.sys

说明DRPI这个高主要是360占用

参数/m /l /s可以合并成/mls

关于安装包的其他微软官方资料:https://docs.microsoft.com/zh-cn/windows-hardware/drivers/other-wdk-downloads

0 人点赞