我正在使用win10sdk中的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]如何理解这个?如何处理这个问题?我正在试着重命名标签,但是每天都有新的东西。
这仅发生在测试设置中使用的一台虚拟机上。
发布于 2019-03-24 17:26:16
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参数可以包括一个星号()来表示任何字符的零个或多个实例,或者一个问号(?*)来表示任何字符的一个实例。标记不能以星号开头。
/c会在显示器(Mapped_Driver)中添加一列,列出使用每个池标记的本地计算机上的驱动程序。仅32位版本的Windows支持此功能。
LocalTagFile指定本地标记文件的路径和文件名、包含本地计算机上的驱动程序列表的格式化文本文件以及它们分配的标记值。此文件是使用/c参数时出现的Mapped_Driver列的数据源。默认值为localtag.txt。
如果使用/c参数,但未指定LocalTagFile的值,并且PoolMon在当前目录中找不到localtag.txt文件,则PoolMon将通过扫描本地计算机(%SystemRoot%\System32\Drivers*.sys)上的驱动程序来生成localtag.txt文件。
/g会在显示器(Mapped_Driver)中添加一列,列出分配每个标签的窗口组件和常用驱动程序。
PoolTagFile指定格式化文本文件的路径和文件名,该文件列出了Windows组件和常用驱动程序的名称以及它们分配的标记值。此文件是使用/g参数时出现的Mapped_Driver列的数据源。
默认值为pooltag.txt,这是微软提供的文件。Pooltag.txt包含在Windows Driver Kit (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参数具有相同的效果,并且可以互换使用。
https://stackoverflow.com/questions/55117771
复制相似问题