共用方式為


使用 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 依配置與釋放之間的差異來排序標記。
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 公用程式尋找記憶體流失的一種方法:

  1. 啟動PoolMon。

  2. 如果您已判斷洩漏發生在非分頁集區,請按一次 P 鍵。 如果您已判斷它發生在分頁集區中,請選取 P 兩次。 如果您不知道,不要選擇 P,這樣就會包含這兩種集區。

  3. 選取 B,依位元組使用量上限排序顯示。

  4. 開始您的測試。 從畫面複製輸出,例如擷取螢幕快照並儲存。

  5. 每隔半小時擷取一個新的螢幕快照。 藉由比較螢幕快照,判斷哪些標記的位元組正在增加。

  6. 停止測試並等候數小時。 判斷在此期間釋放了多少標籤。

一般而言,在應用程式達到穩定的執行狀態之後,它會以相同的速率配置記憶體和釋放記憶體。 如果配置記憶體的速度比釋放記憶體快,其記憶體使用量會隨著時間而增加。 這通常表示記憶體流失。

解決洩漏問題

在您判斷哪個集區標籤與洩漏相關聯之後,您可能已經掌握關於該洩漏的所有必要資訊。 如果您需要判斷配置例程的特定實例造成流失,請參閱 使用核心調試程式尋找內核模式記憶體流失