如果您懷疑發生內核模式記憶體流失,您可以使用 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 | 依配置與釋放之間的差異來排序標記。 |
Q | 退出 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,依位元組使用量上限排序顯示。
開始您的測試。 從畫面複製輸出,例如擷取螢幕快照並儲存。
每隔半小時擷取一個新的螢幕快照。 藉由比較螢幕快照,判斷哪些標記的位元組正在增加。
停止測試並等候數小時。 判斷在此期間釋放了多少標籤。
一般而言,在應用程式達到穩定的執行狀態之後,它會以相同的速率配置記憶體和釋放記憶體。 如果配置記憶體的速度比釋放記憶體快,其記憶體使用量會隨著時間而增加。 這通常表示記憶體流失。
解決洩漏問題
在您判斷哪個集區標籤與洩漏相關聯之後,您可能已經掌握關於該洩漏的所有必要資訊。 如果您需要判斷配置例程的特定實例造成流失,請參閱 使用核心調試程式尋找內核模式記憶體流失。