使用 PoolMon 尋找核心模式記憶體流失
如果您懷疑有核心模式記憶體流失,您可以使用 PoolMon 工具來判斷與流失相關聯的集區標籤。
PoolMon (Poolmon.exe) 會依集區卷標名稱監視集區內存使用量。 此工具包含在 Windows 驅動程式套件 (WDK) 中。 如需詳細資訊,請參閱 PoolMon。
GFlags 集區設定
某些 GFlags 設定,例如特殊集區,將會影響記憶體集區的使用方式。 如需詳細資訊,請參閱 GFlags 和 設定特殊集區。
使用 PoolMon
PoolMon 標頭會顯示分頁和非分頁集區位元組總數。 顯示集區用於每個集區標籤的資料列。 顯示會每隔幾秒鐘自動更新一次。 例如:
Memory: 16224K Avail: 4564K PageFlts: 31 InRam Krnl: 684K P: 680K
Commit: 24140K Limit: 24952K Peak: 24932K Pool N: 744K P: 2180K
## Tag Type Allocs Frees Diff Bytes Per Alloc
CM Paged 1283 ( 0) 1002 ( 0) 281 1377312 ( 0) 4901
Strg Paged 10385 ( 10) 6658 ( 4) 3727 317952 ( 512) 85
Fat Paged 6662 ( 8) 4971 ( 6) 1691 174560 ( 128) 103
MmSt Paged 614 ( 0) 441 ( 0) 173 83456 ( 0) 482
PoolMon 具有命令索引鍵,可根據各種準則排序輸出。 選取與每個命令相關聯的字母,以取得數據。 每個命令需要幾秒鐘的時間才能運作。
排序命令包括:
命令金鑰 | 作業 |
---|---|
P | 將顯示的標記限制為非分頁集區位元組、分頁集區位元組或兩者。 重複按下 P 會依該順序逐一查看每個選項。 |
B | 依位元組使用量上限排序標籤。 |
M | 依位元組配置上限排序標記。 |
T | 依標籤標名稱依字母順序排序標記。 |
E | 導致顯示包含底部分頁和非分頁總計。 |
A | 依配置大小排序標籤。 |
F | 依可用作業排序標籤。 |
S | 依配置與釋放之間的差異來排序標記。 |
問 | 結束 PoolMon。 |
在 PoolMon 中顯示驅動程式名稱
您可以使用PoolMon /g 參數來顯示 Windows 元件的名稱,以及指派每個集區標籤的常用驅動程式。 如果您在使用特定標籤的配置中發現問題,這項功能可協助您識別違規的元件或驅動程式。
元件和驅動程式列在Mapped_Driver數據行中,顯示中最右邊的數據行。 Mapped_Driver數據行的數據來自 pooltag.txt,這是隨 WDK 一起安裝的檔案。
下列命令顯示使用 /g 參數來新增Mapped_Driver數據行。
poolmon /g "C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\triage\pooltag.txt"
顯示特定集區
使用 /i 參數來顯示以特定字串開頭的集區標記,例如 Hid。
poolmon /iHid? /g "C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\triage\pooltag.txt"
Memory:33473120K Avail:20055132K PageFlts: 5 InRam Krnl:10444K P:1843072K
Commit:15035764K Limit:67027552K Peak:16677444K Pool N:1023400K P:1955448K
System pool information
Tag Type Allocs Frees Diff Bytes Per Alloc Mapped_Driver
HidC Paged 1667 ( 0) 1659 ( 0) 8 896 ( 0) 112 [hidclass.sys - HID Class d
HidC Nonp 17375 ( 0) 17256 ( 0) 119 19808 ( 0) 166 [hidclass.sys - HID Class d
HidP Nonp 1014 ( 0) 998 ( 0) 16 6704 ( 0) 419 [hidparse.sys - HID Parser]
使用 PoolMon 公用程式來尋找記憶體流失
以下是使用 PoolMon 公用程式尋找記憶體流失的一種方法:
啟動PoolMon。
如果您已判斷非分頁集區中發生流失,請選取 P 一次。 如果您已判斷它發生在分頁集區中,請選取 [P] 兩次。 如果您不知道,請勿選取 P,因此會包含這兩種集區。
選取 B,依位元組使用量上限排序顯示。
開始測試。 從畫面複製輸出,例如擷取螢幕快照並儲存。
每隔半小時擷取新的螢幕快照。 藉由比較螢幕快照,判斷哪些標籤的位元組增加。
停止測試並等候數小時。 判斷這次釋出多少標記。
一般而言,在應用程式達到穩定的執行狀態之後,它會以相同的速率配置記憶體和釋放記憶體。 如果配置記憶體的速度比釋放記憶體快,其記憶體使用量會隨著時間成長。 這通常表示記憶體流失。
解決流失問題
判斷與流失相關聯的集區標籤之後,您可能只需要知道流失。 如果您需要判斷配置例程的特定實例造成流失,請參閱 使用核心調試程序尋找核心模式記憶體流失。