PoolMon 範例
本主題包含下列 PoolMon 使用範例:
範例 1:顯示和排序集區Mon 輸出
範例 2:顯示驅動程式名稱
範例 3:偵測記憶體外泄
範例 4:檢查集區記憶體流失
範例 5:監視終端機伺服器會話
範例 1:顯示和排序集區Mon 輸出
此範例描述設定 PoolMon 顯示的各種方式。 根據預設,PoolMon 會依標籤值以英數位元順序顯示所有核心記憶體配置。 您可以在命令列或 PoolMon 執行時修改顯示的順序。
下列命令會啟動 PoolMon:
poolmon
下列命令會啟動 PoolMon,並依可用作業數目排序顯示:
poolmon /f
執行 poolmon 時,您可以使用執行時間命令來變更顯示。 例如,若要依使用的位元組數目排序顯示,請按 b。 若要依每個配置依位元組排序,請按 m。
下列命令會啟動 PoolMon,並只顯示來自非分頁集區的配置:
poolmon /p
當 PoolMon 正在執行時,請按 p 來切換分頁集區、非分頁集區或兩者的配置。
若要啟動 PoolMon 並顯示具有特定標籤之配置的資料,請使用 /i 參數。 下列命令會顯示具有 AfdB 標記的配置, (afd.sys用於資料緩衝區的標記) 。
poolmon /iAfdB
若要排除具有特定標籤的配置,請使用 /x 參數。 下列命令會顯示沒有 AfdB 標籤的所有配置;
poolmon /xAfdB
您可以使用星號 (*) 和/或問號 (?) 來指定一組具有相同字元的標記。 下列命令會顯示集區標籤開頭為 Afd的配置,也就是afd.sys所使用的標籤;
poolmon /iAfd*
PoolMon 啟動命令可以包含多個 /i 和 /x 參數。 下列命令會顯示標籤開頭為Aud和四個字元標籤開頭為 Cc 的配置,但CcBc標籤的配置除外;
poolmon /iAud* /iCc?? /xCcBc
您也可以依更新之間的值變更來排序 PoolMon 顯示。 / (參數會將 PoolMon 置於依變更的排序模式中。
下列命令會顯示標記開頭為 Afd的配置,並依配置中的變更排序。 它會使用 /a 參數來依配置數目排序,而 /) 參數會依配置數目的變更排序。
poolmon /iAfd* /( /a
/ (參數和括弧鍵是切換開關。 當 PoolMon 處於依變更的排序模式時,它會將所有排序命令解譯為命令,以依據值中的變更排序。 如果您再次按下括弧按鍵,它會依值排序。
範例 2:顯示驅動程式名稱
您可以使用 PoolMon /g 參數來顯示 Windows 元件的名稱,以及指派每個集區標籤的常用驅動程式。 如果您在配置中發現具有特定標籤的問題,這項功能可協助您識別違規的元件或驅動程式。
元件和驅動程式會列在Mapped_Driver資料行中,顯示最右邊的資料行。 Mapped_Driver資料行的資料來自pooltag.txt,這是隨 WDK 一起安裝的檔案。
下列命令會顯示以 NtF開頭標記配置的記憶體。 (它會使用問號字元 (?) 作為萬用字元。) /g參數會新增Mapped_Driver資料行。
poolmon /iNtF? /g "C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\triage\pooltag.txt"
您也可以將pooltag.txt檔案複製到與 poolmon 相同的位置。 這可讓此使用方式。
poolmon /iNtF? /g
產生的顯示會列出從 NtF開始標記的配置。 顯示最右邊的資料行Mapped_Driver顯示記憶體是由ntfs.sys NTFS 檔案系統的驅動程式所配置。 在此情況下,顯示更具體,因為pooltag.txt包含 NTFS 配置的來源檔案。
Memory: 260620K Avail: 65152K PageFlts: 85 InRam Krnl: 2116K P:19560K
Commit: 237688K Limit: 640916K Peak: 260632K Pool N: 8500K P:33024K
System pool information
Tag Type Allocs Frees Diff Bytes Per Alloc Mapped_Driver
NtFA Nonp 9112 ( 0) 9112 ( 0) 0 0 ( 0) 0 [ntfs.sys - AttrSup.c]
NtFB Paged 3996 ( 0) 3986 ( 0) 10 252088 ( 0) 25208 [ntfs.sys - BitmpSup.c]
NtFC Paged 1579279 ( 0) 1579269 ( 0) 10 640 ( 0) 64 [ntfs.sys - Create.c]
NtFD Nonp 13 ( 0) 13 ( 0) 0 0 ( 0) 0 [ntfs.sys - DevioSup.c]
NtFF Paged 1128 ( 0) 1128 ( 0) 0 0 ( 0) 0 [ntfs.sys - FileInfo.c]
NtFI Nonp 152 ( 0) 152 ( 0) 0 0 ( 0) 0 [ntfs.sys - IndexSup.c]
NtFL Nonp 68398 ( 0) 68390 ( 0) 8 27280 ( 0) 3410 [ntfs.sys - LogSup.c]
NtFS Paged 2915 ( 0) 2614 ( 0) 301 80192 ( 0) 266 [ntfs.sys - SecurSup.c]
NtFa Paged 838 ( 0) 829 ( 0) 9 288 ( 0) 32 [ntfs.sys - AllocSup.c]
NtFd Paged 137696 ( 0) 137688 ( 0) 8 720 ( 0) 90 [ntfs.sys - DirCtrl.c]
NtFf Nonp 2 ( 0) 1 ( 0) 1 40 ( 0) 40 [ntfs.sys - FsCtrl.c]
NtFs Nonp 48825 ( 0) 47226 ( 0) 1599 64536 ( 0) 40 [ntfs.sys - StrucSup.c]
NtFv Paged 551 ( 0) 551 ( 0) 0 0 ( 0) 0 [ntfs.sys - ViewSup.c]
Pooltag.txt很廣泛,但它不是 Windows 中使用的所有標籤的完整清單。 當顯示中顯示的標籤未包含在pooltag.txt中時,PoolMon 會在標籤的 [Mapped_Driver] 資料行中顯示「未知驅動程式」。
下列範例示範 32 位系統上的這個方法。
下列命令會使用 /i 參數來列出以 MEM 結尾的標籤配置。 /g參數會將驅動程式名稱新增至pooltag.txt檔案的顯示。
poolmon /i?MEM /g
產生的顯示會列出以 MEM 結尾的標記配置。 不過,因為 MEM 標籤不包含在pooltag.txt中,所以「未知驅動程式」會出現在Mapped_Driver資料行中取代驅動程式名稱。
Tag Type Allocs Frees Diff Bytes Per Alloc Mapped_Driver
1MEM Nonp 1 ( 0) 0 ( 0) 1 3344 ( 0) 3344 Unknown Driver
2MEM Nonp 1 ( 0) 0 ( 0) 1 3944 ( 0) 3944 Unknown Driver
3MEM Nonp 3 ( 0) 0 ( 0) 3 248 ( 0) 82 Unknown Driver
下列命令會啟動 PoolMon。 它會使用 /i 參數來列出以 MEM 結尾的標記配置。
poolmon /i?MEM
下列命令會列出開頭為 Ip的標籤配置。 它會使用 /g 參數,它會使用 Mapped_Driver 資料行中pooltag.txt檔案的內容。
poolmon /iIp* /g
在產生的顯示中,Mapped_Driver資料行包含來自pooltag.txt檔案的資料。
Memory: 130616K Avail: 23692K PageFlts: 146 InRam Krnl: 2108K P: 9532K
Commit: 187940K Limit: 318628K Peak: 192000K Pool N: 8372K P:13384K
System pool information
Tag Type Allocs Frees Diff Bytes Per Alloc Mapped_Driver
IpEQ Nonp 1 ( 0) 0 ( 0) 1 1808 ( 0) 1808 [ipsec][ipsec.sys - event queue]
IpFI Nonp 26 ( 0) 0 ( 0) 26 7408 ( 0) 284 [ipsec][ipsec.sys - Filter blocks]
IpHP Nonp 1 ( 0) 1 ( 0) 0 0 ( 0) 0 [ipsec.sys - IP Security]
IpIO Nonp 1 ( 0) 1 ( 0) 0 0 ( 0) 0 [ipsec]
IpLA Nonp 1 ( 0) 0 ( 0) 1 248 ( 0) 248 [ipsec][ipsec.sys - lookaside lists]
IpSH Nonp 1 ( 0) 1 ( 0) 0 0 ( 0) 0 [ipsec.sys - IP Security]
IpSI Nonp 1027 ( 0) 0 ( 0) 1027 53272 ( 0) 51 [ipsec][ipsec.sys - initial allcoations]
IpTI Nonp 3 ( 0) 0 ( 0) 3 5400 ( 0) 1800 [ipsec][ipsec.sys - timers]
範例 3:偵測記憶體外泄
此範例建議使用 PoolMon 來偵測記憶體流失的程式。
使用 /p /p 參數啟動 PoolMon (只會顯示分頁集區) 和 /b (依位元組數目排序的配置) 。
poolmon /p /p /b
讓 PoolMon 執行數小時。 因為啟動 PoolMon 會變更資料,所以它必須先重新取得穩定狀態,資料才可靠。
將 PoolMon 所產生的資訊儲存為螢幕擷取畫面,或從命令視窗複製資訊,並將它貼到 [記事本]。
返回 PoolMon,按 兩次 p 鍵,只顯示來自非分頁集區的配置。
重複步驟 3 和 4 大約每半小時至少兩小時,每次切換分頁和非分頁集區會顯示。
當資料收集完成時,請檢查 Diff (配置作業減去可用作業) 和 Bytes (配置位元組數目減去每個標記) 值釋放的位元組數目,並注意持續增加的任何位元組數目。
接下來,停止 PoolMon,等候數小時,然後重新開機 PoolMon。
檢查增加的配置,並判斷位元組現在是否已釋放。 可能的原因是尚未釋放或持續增加大小的配置。
範例 4:檢查集區記憶體流失
下列範例示範如何使用 PoolMon 來調查來自可疑印表機驅動程式的集區記憶體流失。 在此範例中,PoolMon 會顯示 Windows 使用 Dsrd 標記收集記憶體配置的相關資料。
有些印表機驅動程式會在配置圖形化裝置介面 (GDI) 物件和相關聯的記憶體時指派 Drsd 標籤。 如果印表機驅動程式有物件流失,以 Drsd 標記配置的記憶體也會流失。
注意 執行此範例中的步驟之前,請確定您所使用的印表機在您完成之前不會中斷。 否則,結果可能會無效。
在命令列中,輸入下列命令:
poolmon /iDrsd
此命令會指示 PoolMon 顯示具有 Drsd 標籤之配置的資訊。 (集區標籤區分大小寫,因此請務必輸入命令,如 shown.)
記錄 Diff 和 Bytes 資料行中的值。 在下列範例中,Diff 的值是 21,而 Bytes 的數目是 17472。
Memory: 130480K Avail: 91856K PageFlts: 1220 InRam Krnl: 2484K P: 7988K
Commit: 30104K Limit: 248432K Peak: 34028K Pool N: 2224K P: 8004K
Tag Type Allocs Frees Diff Bytes Per Alloc
Drsd Paged 560 ( 177) 539 ( 171) 21 17472 ( 4992) 832
將作業傳送至印表機、短暫等候 Windows 返回正常狀態,然後記錄 Diff 和 Bytes 資料行的值。
Memory: 130480K Avail: 91808K PageFlts: 1240 InRam Krnl: 2488K P: 7996K
Commit: 30152K Limit: 248432K Peak: 34052K Pool N: 2224K P: 8012K
Tag Type Allocs Frees Diff Bytes Per Alloc
Drsd Paged 737 ( 0) 710 ( 0) 27 22464 ( 0) 832
當印表機驅動程式的記憶體管理正常運作時,Diff 的值應該會在列印後回到其原始值 21。 不過,如上述輸出所示,Diff 的值會增加到 27,而位元組數目會增加到 22464。 初始和後續輸出之間的差異表示六個 Drsd 區塊,在列印期間外泄總共 4992 個位元組。
如需詳細資訊
如果您認為您已識別出外泄的驅動程式,請移至 Microsoft 支援 網站並搜尋知識庫以取得相關文章,或如果這是協力廠商驅動程式,請連絡廠商。
範例 5:監視終端機伺服器會話
此範例示範數種方式,顯示來自終端機服務會話集區的配置。 它示範 如何使用 /s 命令列參數,以及 s、 TSSessionID和執行參數 。
下列命令會顯示來自所有終端機服務會話集區的配置。 在此範例中,設定為終端機伺服器的本機電腦正在裝載會話,而用戶端電腦會使用遠端桌面功能來連線到主機。
poolmon /s
為了回應,PoolMon 會顯示來自所有會話集區的配置。 請注意標頭中的「所有會話集區資訊」標題。
Memory: 523572K Avail: 233036K PageFlts: 344 InRam Krnl: 1828K P:18380K
Commit: 193632K Limit:1279764K Peak: 987356K Pool N:14332K P:18644K
All sessions pool information
Tag Type Allocs Frees Diff Bytes Per Alloc
Bmfd Paged 361 ( 0) 336 ( 0) 25 57832 ( 0) 2313
DDfb Paged 34 ( 0) 22 ( 0) 12 720 ( 0) 60
Dddp Paged 8 ( 0) 6 ( 0) 2 272 ( 0) 136
Dh 1 Paged 24 ( 0) 24 ( 0) 0 0 ( 0) 0
Dh 2 Paged 344 ( 0) 344 ( 0) 0 0 ( 0) 0
Dvgr Paged 2 ( 0) 2 ( 0) 0 0 ( 0) 0
GDev Paged 108 ( 0) 102 ( 0) 6 20272 ( 0) 3378
GFil Paged 29 ( 0) 27 ( 0) 2 160 ( 0) 80
GPal Paged 11 ( 0) 8 ( 0) 3 816 ( 0) 272
GTmp Paged 88876 ( 1) 88876 ( 1) 0 0 ( 0) 0
GUma Paged 2 ( 0) 2 ( 0) 0 0 ( 0) 0
Galp Paged 3250 ( 0) 3250 ( 0) 0 0 ( 0) 0
Gbaf Paged 9829 ( 0) 9801 ( 0) 28 19712 ( 0) 704
Gcac Paged 3761 ( 0) 3706 ( 0) 55 288968 ( 0) 5253
Gcsl Paged 1 ( 0) 0 ( 0) 1 488 ( 0) 488
Gdbr Paged 6277 ( 0) 6271 ( 0) 6 1872 ( 0) 312
...
若要查看特定會話集區的配置,請在 /s 參數後面立即輸入會話識別碼,如下列命令所示。 此命令會顯示終端機服務會話 0 的會話集區配置。
poolmon /s0
回應中,PoolMon 會顯示來自終端機服務會話 0 的會話集區配置。 請注意標頭中的「會話 0 集區資訊」標題。
Memory: 523572K Avail: 233024K PageFlts: 525 InRam Krnl: 1828K P:18384K
Commit: 193760K Limit:1279764K Peak: 987356K Pool N:14340K P:18644K
Session 0 pool information
Tag Type Allocs Frees Diff Bytes Per Alloc
Bmfd Paged 361 ( 0) 336 ( 0) 25 57832 ( 0) 2313
DDfb Paged 34 ( 0) 22 ( 0) 12 720 ( 0) 60
Dddp Paged 8 ( 0) 6 ( 0) 2 272 ( 0) 136
Dh 1 Paged 24 ( 0) 24 ( 0) 0 0 ( 0) 0
Dh 2 Paged 344 ( 0) 344 ( 0) 0 0 ( 0) 0
Dvgr Paged 2 ( 0) 2 ( 0) 0 0 ( 0) 0
GDev Paged 108 ( 0) 102 ( 0) 6 20272 ( 0) 3378
GFil Paged 29 ( 0) 27 ( 0) 2 160 ( 0) 80
GPal Paged 11 ( 0) 8 ( 0) 3 816 ( 0) 272
GTmp Paged 89079 ( 99) 89079 ( 99) 0 0 ( 0) 0
GUma Paged 2 ( 0) 2 ( 0) 0 0 ( 0) 0
Galp Paged 3250 ( 0) 3250 ( 0) 0 0 ( 0) 0
Gbaf Paged 9830 ( 0) 9802 ( 0) 28 19712 ( 0) 704
Gcac Paged 3762 ( 0) 3707 ( 0) 55 283632 ( 0) 5156
Gcsl Paged 1 ( 0) 0 ( 0) 1 488 ( 0) 488
Gdbr Paged 6280 ( 0) 6274 ( 0) 6 1872 ( 0) 312
...
若要協助判斷哪些驅動程式和元件從會話集區配置記憶體,請新增 /g 參數,如下列命令所示。 /g參數會新增Mapped_Driver資料行,其中列出指派每個標記的 Windows 元件和驅動程式。
poolmon /s0 /g
Memory: 523572K Avail: 235876K PageFlts: 43 InRam Krnl: 1900K P:18860K
Commit: 185040K Limit:1279764K Peak: 987356K Pool N:14684K P:19124K
Session 0 pool information
Tag Type Allocs Frees Diff Bytes Per Alloc Mapped_Driver
Bmfd Paged 421 ( 0) 396 ( 0) 25 57832 ( 0) 2313 [Font related stuff]
DDfb Paged 34 ( 0) 22 ( 0) 12 720 ( 0) 60 Unknown Driver
Dddp Paged 11 ( 0) 6 ( 0) 5 392 ( 0) 78 Unknown Driver
Dh 1 Paged 37 ( 0) 35 ( 0) 2 224 ( 0) 112 Unknown Driver
Dh 2 Paged 367 ( 0) 364 ( 0) 3 912 ( 0) 304 Unknown Driver
Dvgr Paged 2 ( 0) 2 ( 0) 0 0 ( 0) 0 [vga for risc video driver]
GDev Paged 119 ( 0) 113 ( 0) 6 20272 ( 0) 3378 [Gdi pdev]
GFil Paged 29 ( 0) 27 ( 0) 2 160 ( 0) 80 [Gdi engine descriptor list]
GPal Paged 11 ( 0) 8 ( 0) 3 816 ( 0) 272 [Gdi Objects]
GTmp Paged 98626 ( 1) 98626 ( 1) 0 0 ( 0) 0 [Gdi Objects]
GUma Paged 2 ( 0) 2 ( 0) 0 0 ( 0) 0 [Gdi Objects]
Galp Paged 3250 ( 0) 3250 ( 0) 0 0 ( 0) 0 [Gdi Objects]
Gbaf Paged 10331 ( 0) 10305 ( 0) 26 18304 ( 0) 704 [Gdi Objects]
Gcac Paged 4722 ( 0) 4666 ( 0) 56 305400 ( 0) 5453 [Gdi glyph cache]
Gcsl Paged 1 ( 0) 0 ( 0) 1 488 ( 0) 488 [Gdi string resource script names]
Gdbr Paged 6972 ( 0) 6965 ( 0) 7 2184 ( 0) 312 [Gdi driver brush realization]
您也可以在執行 PoolMon 時設定終端機服務會話集區顯示。 下表顯示一系列執行中的命令,其輸入順序和產生的 PoolMon 顯示順序。
此數列的開頭為啟動 PoolMon 的命令。 當 PoolMon 正在執行時,所有其他參數都會輸入。
poolmon
答案 | 結果 | 描述 |
---|---|---|
s |
顯示所有會話集區。 |
|
s |
顯示系統集區。 |
s參數會切換系統集區和終端機服務會話集區之間的顯示。 |
0 |
顯示會話 0 集區。 |
您可以在顯示系統集區時輸入會話識別碼。 |
7 |
顯示會話 7 集區。 |
|
a |
顯示會話 7 的集區配置,依配置數目排序。 |
所有標準執行的參數都對會話集區顯示有效。 |
0 |
顯示會話 0 的配置,依配置數目排序。 |
會話和排序選項會保留到變更為止。 |
s |
顯示系統集區。 |
|
s |
顯示會話 0 的配置,依配置數目排序。 |
會話選項會保留。 |
10ENTER |
顯示會話 1 配置,然後顯示會話 0 配置。 |
如果沒有 i,您只能輸入會話識別碼 0 到 9。 |
i |
提示輸入終端機伺服器會話識別碼。 |
|
10 |
顯示會話 10 配置。 |
|
i |
提示輸入終端機伺服器會話識別碼。 |
若要顯示所有會話集區,請按 i ,然後按 ENTER 鍵。 |
ENTER |
顯示所有會話集區。 |
只有設定為終端機伺服器的系統會從會話集區配置記憶體。 如果您使用 PoolMon 在不是終端機伺服器的電腦上顯示會話集區,或輸入 Windows 上不存在的會話識別碼,PoolMon 不會顯示任何配置。 相反地,它只會顯示具有一般記憶體資料的標題。
下列命令會顯示來自所有終端機服務會話集區的配置:
poolmon /s
下圖顯示 PoolMon 顯示,如果 /s 命令已提交至執行 Windows XP 且無法設定為終端機伺服器的電腦,則會產生此顯示:
Memory: 260620K Avail: 44956K PageFlts: 308 InRam Krnl: 2744K P:20444K
Commit: 185452K Limit: 640872K Peak: 192472K Pool N: 8112K P:20648K
All sessions pool information
Tag Type Allocs Frees Diff Bytes Per Alloc