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] 資料行中顯示「未知驅動程式」。 發生這種情況時,您可以使用 /c 參數在 32 位系統上搜尋驅動程式 () ,並判斷它們是否指派標籤。 (PoolMon 無法在 64 位版本的 Windows 上產生本機標籤檔案,且無法使用 -c 選項。)

下列範例示範 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

在此情況下,您可以使用 /c 參數來編譯本機驅動程式的清單及其指派的標籤,然後在 [Mapped_Driver] 資料行中顯示本機驅動程式的名稱。

下列命令會啟動 PoolMon。 它會使用 /i 參數來列出以 MEM 結尾的標記配置, 以及 /c 參數來顯示指派標記的本機驅動程式。

poolmon /i?MEM /c

如果您未指定本機標籤檔案,且 PoolMon 找不到localtag.txt檔案,它會建立一個檔案,如下列畫面訊息所示。

d:\tools\poolmon>poolmon /?MEM /c
PoolMon: No localtag.txt in current directory
PoolMon: Creating localtag.txt in current directory......

產生的顯示會使用新建立localtag.txt檔案中的內容,會在 [Mapped_Driver] 資料行中顯示本機驅動程式名稱。

 Memory:  260620K Avail:   57840K  PageFlts:   162   InRam Krnl: 2116K P:19448K
 Commit: 244580K Limit: 640916K Peak: 265416K            Pool N: 8496K P:32904K
 System pool information
 Tag  Type     Allocs            Frees            Diff   Bytes      Per Alloc  Mapped_Driver

 1MEM Nonp          1 (   0)         0 (   0)        1    3344 (     0)   3344 [el90xbc5]
 2MEM Nonp          1 (   0)         0 (   0)        1    3944 (     0)   3944 [el90xbc5]
 3MEM Nonp          3 (   0)         0 (   0)        3     248 (     0)     82 [el90xbc5]

如需完整的驅動程式名稱顯示,您可以在命令中合併 /c/g 參數。 (參數的順序不會變更 output。) 下列命令會列出以 Ip開頭的標籤配置。 它會使用 /c 參數,它會使用 Mapped_Driver 資料行中localtag.txt檔案的內容,而 /g 參數會使用 Mapped_Driver 資料行中pooltag.txt檔案的內容。

poolmon /iIp* /c /g

在產生的顯示中,Mapped_Driver資料行包含來自localtag.txt和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 來偵測記憶體流失的程式。

  1. 使用 /p /p 參數啟動 PoolMon (只會顯示分頁集區) 和 /b (依位元組數目排序的配置) 。

    poolmon /p /p /b
    
  2. 讓 PoolMon 執行數小時。 因為啟動 PoolMon 會變更資料,所以它必須先重新取得穩定狀態,資料才可靠。

  3. 將 PoolMon 所產生的資訊儲存為螢幕擷取畫面,或從命令視窗複製資訊,並將它貼到記事本。

  4. 返回 PoolMon,按 兩次 p 鍵,只顯示來自非分頁集區的配置。

  5. 重複步驟 3 和 4 大約每半小時至少兩小時,每次切換分頁和非分頁集區會顯示。

  6. 當資料收集完成時,請檢查 Diff (配置作業減去可用作業) ,而 Bytes (配置位元組數目減去每個標籤的可用位元組數目減去) 值,並注意持續增加的任何位元組數目。

  7. 接下來,停止 PoolMon,等候數小時,然後重新開機 PoolMon。

  8. 檢查增加的配置,並判斷位元組現在是否已釋放。 可能的原因是尚未釋放或持續增加大小的配置。

範例 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 命令列參數,以及 sTSSessionIDi 執行參數。

下列命令會顯示來自所有終端機服務會話集區的配置。 在此範例中,設定為終端機伺服器的本機電腦正在裝載會話,而用戶端電腦會使用遠端桌面功能來連線到主機。

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