Esempi di PoolMon

Questo argomento include gli esempi seguenti di utilizzo di PoolMon:

Esempio 1: Visualizzare e ordinare l'output PoolMon

Esempio 2: Visualizzare i nomi dei driver

Esempio 3: Rilevare la perdita di memoria

Esempio 4: Esaminare una perdita di memoria del pool

Esempio 5: Monitorare una sessione di Terminal Server

Esempio 1: Visualizzare e ordinare l'output PoolMon

Questo esempio descrive diversi modi per configurare la visualizzazione PoolMon. Per impostazione predefinita, PoolMon visualizza tutte le allocazioni di memoria del kernel in ordine alfanumerico in base al valore del tag. È possibile modificare l'ordinamento della visualizzazione nella riga di comando o mentre PoolMon è in esecuzione.

Il comando seguente avvia PoolMon:

poolmon

Il comando seguente avvia PoolMon e ordina la visualizzazione in base al numero di operazioni gratuite:

poolmon /f

Durante l'esecuzione di poolmon, è possibile usare i comandi di runtime per modificare la visualizzazione. Ad esempio, per ordinare la visualizzazione in base al numero di byte utilizzati, premere b. Per ordinare in base ai byte per allocazione, premere m.

Il comando seguente avvia PoolMon e visualizza solo le allocazioni dal pool non di paging:

poolmon /p

Mentre PoolMon è in esecuzione, premere p per attivare o disattivare le allocazioni dal pool di paging, dal pool non di paging o da entrambi.

Per avviare PoolMon e visualizzare i dati per le allocazioni con un tag specifico, usare il parametro /i . Il comando seguente visualizza le allocazioni con il tag AfdB (il tag usato da afd.sys per i buffer di dati).

poolmon /iAfdB

Per escludere le allocazioni con un tag specifico, usare il parametro /x . Il comando seguente visualizza tutte le allocazioni che non hanno il tag AfdB ;

poolmon /xAfdB

È possibile usare un asterisco (*) e/o un punto interrogativo (?) per specificare un set di tag con gli stessi caratteri. Il comando seguente visualizza le allocazioni con tag del pool che iniziano con Afd, il tag usato da afd.sys;

poolmon /iAfd*

Un comando di avvio PoolMon può includere più parametri /i e /x . Il comando seguente visualizza le allocazioni con tag che iniziano con Aud e i tag a quattro caratteri che iniziano con Cc, ad eccezione delle allocazioni con il tag CcBc ;

poolmon /iAud* /iCc?? /xCcBc

È anche possibile ordinare la visualizzazione PoolMon in base alla modifica in un valore tra gli aggiornamenti. Il parametro /( inserisce PoolMon in modalità di ordinamento per modifica.

Il comando seguente visualizza le allocazioni con tag che iniziano con Afd e ordina in base alla modifica nelle allocazioni. Usa il / a parametro per ordinare in base al numero di allocazioni e al parametro /) per ordinare in base alla modifica del numero di allocazioni.

poolmon /iAfd* /( /a

Il parametro /( e le chiavi tra parentesi sono interruttori attivati. Quando PoolMon è in modalità di ordinamento per modifica, interpreta tutti i comandi di ordinamento come comandi per ordinare in base alla modifica nel valore. Se si preme di nuovo una parentesi, viene ordinato in base al valore .

Esempio 2: Visualizzare i nomi dei driver

È possibile usare il parametro PoolMon /g per visualizzare i nomi dei componenti di Windows e i driver usati comunemente che assegnano ogni tag del pool. Se si verifica un problema nelle allocazioni con un tag specifico, questa funzionalità consente di identificare il componente o il driver che causa l'errore.

I componenti e i driver sono elencati nella colonna Mapped_Driver, la colonna più a destra nella visualizzazione. I dati per la colonna Mapped_Driver provengono da pooltag.txt, un file installato con wdk.

Il comando seguente visualizza la memoria allocata con tag che iniziano con NtF. Usa il carattere punto interrogativo (?) come carattere jolly. Il / g parametro aggiunge la colonna Mapped_Driver.

poolmon /iNtF? /g "C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\triage\pooltag.txt"

È anche possibile copiare il file pooltag.txt nella stessa posizione di poolmon. Ciò consente questo utilizzo.

poolmon /iNtF? /g

La visualizzazione risultante elenca le allocazioni con tag che iniziano in NtF. La colonna più a destra nella visualizzazione, Mapped_Driver, indica che la memoria è stata allocata da ntfs.sys, il driver per il file system NTFS. In questo caso, lo schermo è ancora più specifico, perché pooltag.txt include i file di origine per le allocazioni 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 è esteso, ma non è un elenco completo di tutti i tag usati in Windows. Quando un tag visualizzato nella visualizzazione non è incluso in pooltag.txt, PoolMon visualizza "Driver sconosciuto" nella colonna Mapped_Driver per il tag.

Gli esempi seguenti illustrano questo metodo in un sistema a 32 bit.

Il comando seguente usa il parametro /i per elencare le allocazioni con tag che terminano in MEM. Il / g parametro aggiunge il nome del driver alla visualizzazione dal file pooltag.txt.

poolmon /i?MEM /g

La visualizzazione risultante elenca le allocazioni con tag che terminano con MEM. Tuttavia, poiché i tag MEM non sono inclusi in pooltag.txt, "Driver sconosciuto" viene visualizzato nella colonna Mapped_Driver al posto del nome del 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

Il comando seguente avvia PoolMon. Usa il parametro /i per elencare le allocazioni con tag che terminano con MEM.

poolmon /i?MEM 

Il comando seguente elenca le allocazioni per i tag che iniziano con Ip. Usa il / g parametro , che usa il contenuto del file pooltag.txt nella colonna Mapped_Driver.

poolmon /iIp* /g

Nella visualizzazione risultante la colonna Mapped_Driver contiene i dati dei file 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]

Esempio 3: Rilevare la perdita di memoria

Questo esempio suggerisce una procedura per l'uso di PoolMon per rilevare una perdita di memoria.

  1. Avviare PoolMon con i parametri /p /p (visualizzare solo le allocazioni dal pool di paging) e /b (ordinare in base al numero di byte).

    poolmon /p /p /b
    
  2. Consenti l'esecuzione di PoolMon per alcune ore. Poiché l'avvio di PoolMon modifica i dati, deve recuperare uno stato stabile prima che i dati siano affidabili.

  3. Salvare le informazioni generate da PoolMon, come screenshot, oppure copiandole dalla finestra di comando e incollandole nel Blocco note.

  4. Tornando a PoolMon, premere due volte il tasto p per visualizzare solo le allocazioni dal pool non di paging.

  5. Ripetere i passaggi 3 e 4 circa ogni mezz'ora per almeno due ore, spostandosi tra il pool di paging e quello non di paging ogni volta.

  6. Al termine della raccolta dati, esaminare i valori Diff (operazioni di allocazione meno operazioni gratuite) e Byte (numero di byte allocati meno numero di byte liberati) per ogni tag e prendere nota di qualsiasi valore che aumenta continuamente.

  7. Arrestare quindi PoolMon, attendere alcune ore e quindi riavviare PoolMon.

  8. Esaminare le allocazioni in aumento e determinare se i byte vengono ora liberati. La causa probabile è che le allocazioni che non sono ancora state liberate o che hanno continuato ad aumentare le dimensioni.

Esempio 4: Esaminare una perdita di memoria del pool

Nell'esempio seguente viene illustrato l'uso di PoolMon per analizzare una perdita di memoria del pool da un driver sospetto della stampante. In questo esempio PoolMon visualizza i dati raccolti da Windows sulle allocazioni di memoria con il tag Dsrd.

Alcuni driver della stampante assegnano il tag Drsd quando allocano oggetti GDI (Graphical Device Interface) e la memoria associata. Se un driver della stampante ha una perdita di oggetti, anche la memoria allocata con il tag Drsd perderà.

Nota Prima di eseguire i passaggi di questo esempio, assicurarsi che la stampante in uso non venga interrotta fino al termine. In caso contrario, i risultati potrebbero non essere validi.

Nella riga di comando digitare quanto segue:

poolmon /iDrsd

Questo comando indica a PoolMon di visualizzare le informazioni per le allocazioni con il tag Drsd. I tag del pool fanno distinzione tra maiuscole e minuscole, quindi assicurarsi di digitare il comando esattamente come illustrato.

Registrare i valori nelle colonne Diff e Byte. Nella visualizzazione di esempio seguente il valore di Diff è 21 e il numero di byte è 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 

Inviare un processo alla stampante, attendere brevemente che Windows torni normale e quindi registrare i valori per le colonne Diff e Byte.

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  

Quando la gestione della memoria per il driver della stampante funziona correttamente, il valore di Diff deve tornare al valore originale di 21 dopo la stampa. Tuttavia, come illustrato nell'output precedente, il valore di Diff è salito a 27 e il numero di byte è salito a 22464. La differenza tra l'output iniziale e quello successivo indica che sei blocchi Drsd, con un totale di 4992 byte, persi durante la stampa.

Per altre informazioni

Se si ritiene di aver identificato un driver che causa perdite, passare al sito Web del supporto Tecnico Microsoft e cercare gli articoli pertinenti della Knowledge Base oppure contattare il fornitore se si tratta di un driver di terze parti.

Esempio 5: Monitorare una sessione di Terminal Server

Questo esempio illustra diversi modi per visualizzare le allocazioni dai pool di sessioni di Servizi terminal. Illustra l'uso del parametro della riga di comando /s e dei parametri s, TSSessionID e i che eseguono i parametri.

Il comando seguente visualizza le allocazioni da tutti i pool di sessioni di Servizi terminal. In questo esempio, il computer locale, configurato come Terminal Server, ospita le sessioni e i computer client usano la funzionalità Desktop remoto per connettersi all'host.

poolmon /s

In risposta, PoolMon visualizza le allocazioni da tutti i pool di sessioni. Si noti il titolo "Tutte le sessioni di informazioni sul pool" nell'intestazione.

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
 ...

Per visualizzare le allocazioni da un pool di sessioni specifico, digitare l'ID sessione immediatamente dopo il parametro /s , come illustrato nel comando seguente. Questo comando visualizza le allocazioni del pool di sessioni per la sessione di Servizi terminal 0.

poolmon /s0

In risposta, PoolMon visualizza le allocazioni dal pool di sessioni per la sessione di Servizi terminal 0. Si noti il titolo "Session 0 pool information" nell'intestazione.

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
 ...

Per determinare quali driver e componenti allocano la memoria dal pool di sessioni, aggiungere il parametro /g , come illustrato nel comando seguente. Il parametro /g aggiunge una colonna Mapped_Driver che elenca i componenti e i driver di Windows che assegnano ogni tag.

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]

È anche possibile configurare la visualizzazione del pool di sessioni di Servizi terminal durante l'esecuzione di PoolMon. La tabella seguente illustra una serie di comandi in esecuzione, nell'ordine in cui vengono digitati e nella visualizzazione PoolMon risultante.

La serie inizia con un comando per avviare PoolMon. Tutti gli altri parametri vengono digitati durante l'esecuzione di PoolMon.

poolmon
Chiave Risultato Descrizione

s

Visualizza tutti i pool di sessioni.

s

Visualizza i pool di sistema.

Il parametro s attiva o disattiva la visualizzazione tra i pool di sistema e i pool di sessioni di Servizi terminal.

0

Visualizza il pool di sessione 0.

È possibile digitare un ID sessione durante la visualizzazione dei pool di sistema.

7

Visualizza il pool di sessione 7.

Un

Visualizza le allocazioni del pool per la sessione 7, ordinate in base al numero di allocazioni.

Tutti i parametri di esecuzione standard sono validi per la visualizzazione del pool di sessioni.

0

Visualizza le allocazioni per la sessione 0, ordinate in base al numero di allocazioni.

Le opzioni di ordinamento e sessione vengono mantenute fino a quando non vengono modificate.

s

Visualizza i pool di sistema.

s

Visualizza le allocazioni per la sessione 0, ordinate in base al numero di allocazioni.

L'opzione sessione viene mantenuta.

10ENTER

Visualizza le allocazioni della sessione 1 e quindi visualizza le allocazioni della sessione 0.

Senza i, è possibile immettere solo GLI ID sessione da 0 a 9.

i

Richiede un ID sessione di Terminal Server.

10

Visualizza allocazioni di sessione 10.

i

Richiede un ID sessione di Terminal Server.

Per visualizzare tutti i pool di sessioni, premere i e quindi premere INVIO.

INVIO

Visualizza tutti i pool di sessioni.

Solo i sistemi configurati come Terminal Server allocano memoria dal pool di sessioni. Se si usa PoolMon per visualizzare il pool di sessioni in un computer che non è un Terminal Server o se si digita un ID sessione che non esiste in Windows, PoolMon non visualizza allocazioni. Visualizza invece solo le intestazioni con dati di memoria generali.

Il comando seguente visualizza le allocazioni da tutti i pool di sessioni di Servizi terminal:

poolmon /s

La figura seguente mostra la visualizzazione PoolMon che determinerebbe se il comando /s è stato inviato a un computer che esegue Windows XP che non è stato possibile configurare come terminal server:

 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