我正在使用Win 10 SDK中的poolmon
来分析内存泄漏,我正在卸载驱动程序后立即运行它。我的命令行是
poolmon.exe -s -e -g -r -n poolmondump.txt
来自poolmon /?
的论证定义
-s Display session pool
-n [Logfile] Take a pool snapshot
Logfile maybe specified, default is poolsnap.log
-g [PoolTagFile] Display driver information using PoolTagFile
If PoolTagFile is not specified
use 'pooltag.txt' from current directory
-e Display totals
-r Print memory summary information
一块输出是
Tag Type Allocs Frees Diff Bytes Per Alloc Mapped_Driver
SIFP Paged 245366784 2359304 243007480 -1 17 [MyDriver.sys]
SIFP Nonp 7 7 0 -1 -1 [MyDriver.sys]
有时候会有负面的Diff
Tag Type Allocs Frees Diff Bytes Per Alloc Mapped_Driver
NweN Paged 529879 4784171 -4254292 -1 1 [MyDriver.sys]
PBDN Paged 43 66 -23 1 0 [MyDriver.sys]
怎么理解这个?怎么处理这个?我正在尝试重命名标签,但每天都有新的东西。 这仅在测试设置中使用的一个虚拟机上发生。
PoolMan驱动程序存在于windows中,它:
显示操作系统从系统分页和非分页内核池以及用于终端服务会话的内存池中收集的有关内存分配的数据。数据按池分配标记分组。
驱动程序开发人员和测试人员在创建新驱动程序,更改驱动程序代码或强调驱动程序时,经常使用PoolMon来检测内存泄漏。您还可以在每个测试阶段使用PoolMon来查看驱动程序的分配模式和自由操作,并显示驱动程序在任何给定时间使用的池内存量。
以下是命令:
poolmon [/iTag] [/xTag] [/c [LocalTagFile]] [/g [PoolTagFile]] [/s[TSSessionID]] [ /p | /p /p ] [/e] [/( | /)] [/t | /a| /f| /d | /b| /m] [/l] [/n [File]] [/? | /h]
说明:
参数
/ i仅显示具有指定池标记的分配。您可以在PoolMon命令中拥有多个/ i参数。不要在/ i和Tag参数之间键入空格。
/ x从显示中排除具有指定标记的分配。您可以在PoolMon命令中拥有多个/ x参数。不要在/ x和Tag参数之间键入空格。
Tag指定池标记或池标记模式。池标记区分大小写。 Tag参数可以包括用于表示任何字符的零个或多个实例的星号()或用于表示任何字符的一个实例的问号(?*)。不要用星号开始标记。
/ c向显示(Mapped_Driver)添加一列,列出使用每个池标记的本地计算机上的驱动程序。仅在32位版本的Windows上支持此功能。
LocalTagFile指定本地标记文件的路径和文件名,包含本地计算机上驱动程序列表的格式化文本文件以及它们分配的标记值。此文件是使用/ c参数时显示的Mapped_Driver列的数据源。默认为localtag.txt。
如果使用/ c参数,但未指定LocalTagFile的值,并且PoolMon在当前目录中找不到localtag.txt文件,则PoolMon通过扫描本地计算机上的驱动程序生成localtag.txt文件(%SystemRoot) %\ System32 \ Drivers * .sys)。
/ g在显示(Mapped_Driver)中添加一列,列出Windows组件和分配每个标记的常用驱动程序。
PoolTagFile指定格式化文本文件的路径和文件名,该文件列出Windows组件和常用驱动程序的名称以及它们分配的标记值。此文件是使用/ g参数时显示的Mapped_Driver列的数据源。
默认值为pooltag.txt,由Microsoft提供的文件。 Pooltag.txt包含在Windows驱动程序工具包(WDK)的Tools \ Other子目录中。
/ s显示终端服务会话池的分配。
TSSessionID仅显示指定会话池中的分配。不要在/ s参数和TSSessionID参数之间键入空格。
/ p仅显示非分页池的分配。
/ p / p仅显示分页池中的分配。
/ e显示池总数。总计显示在显示屏的底部。
/(或/)打开逐个变换模式。使用/(或/),PoolMon按值(分配,自由操作和字节)的变化进行排序,而不是值。每个值的更改显示在值后面的括号中。
与/ a,/ f,/ b或/ m一起使用。例如,poolmon / a按分配数对显示进行排序,而poolmon /(/ a按分配数量的变化对显示进行排序。
左括号和右括号字符具有相同的效果,可以互换使用。
/ t按标签名称按字母顺序排序。这是默认值。
/ a按分配数量对标签进行排序。
/ f按自由操作的数量对标签进行排序。
/ d按字节分配和释放的字节之间的差异对标记进行排序。
/ b按使用的字节对标签进行排序。
/ m按每个分配的字节对标签进行排序。
/ l关闭突出显示。默认情况下,PoolMon突出显示自上次更新以来已更改的值。
/ n将PoolMon输出的快照保存到文件,而不是在命令窗口中显示它。您可以包含其他命令行参数来配置输出。
由于快照数据是静态的,因此显示PoolMon显示中值更改的列不会显示在快照文件中。
文件指定快照文件的名称和位置。默认值为poolsnap.log。
/?或/ h显示命令行语法。 /?和/ h参数具有相同的效果,可以互换使用。