我正在使用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]
如何理解?怎么处理呢?
我正在尝试重命名标签,但是每天都有一些新内容。
这仅在测试设置中使用的虚拟机之一上发生。
答案 0 :(得分:-1)
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)中添加一列,列出了以下驱动程序 使用每个池标记的本地计算机。支持此功能 仅在Windows的32位版本上。
LocalTagFile指定本地标记文件的路径和文件名, 包含本地驱动程序列表的格式化文本文件 计算机及其分配的标签值。这个文件就是数据 使用/ c时出现的Mapped_Driver列的源 参数。默认值为localtag.txt。
如果使用/ c参数,但不为 LocalTagFile,而PoolMon在以下位置找不到localtag.txt文件: 当前目录,PoolMon通过扫描生成localtag.txt文件 本地计算机上的驱动程序 (%SystemRoot%\ System32 \ Drivers * .sys)。
/ g在显示Windows的显示(Mapped_Driver)中添加一列 组件和分配每个标签的常用驱动程序。
PoolTagFile指定格式化文本文件的路径和文件名 列出了Windows组件和常用驱动程序的名称 以及它们分配的标签值。此文件是 使用/ g参数时出现的Mapped_Driver列。
默认值为pooltag.txt,这是Microsoft提供的文件。 Pooltag.txt 包含在Windows驱动程序工具包的Tools \ Other子目录中 (WDK)。
/ 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参数具有 具有相同的效果,可以互换使用。