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.
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
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.
Salvare le informazioni generate da PoolMon, come screenshot, oppure copiandole dalla finestra di comando e incollandole nel Blocco note.
Tornando a PoolMon, premere due volte il tasto p per visualizzare solo le allocazioni dal pool non di paging.
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.
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.
Arrestare quindi PoolMon, attendere alcune ore e quindi riavviare PoolMon.
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