Usare PoolMon per trovare una perdita di memoria in modalità kernel
Se si sospetta che si verifichi una perdita di memoria in modalità kernel, è possibile usare lo strumento PoolMon per determinare quale tag di pool è associato alla perdita.
PoolMon (Poolmon.exe) monitora l'utilizzo della memoria del pool in base al nome del tag del pool. Questo strumento è incluso in Windows Driver Kit (WDK). Per altre informazioni, vedere PoolMon.
Impostazioni del pool GFlags
Alcune impostazioni di GFlags, ad esempio Il pool speciale, influiscono sul modo in cui vengono usati i pool di memoria. Per altre informazioni, vedere GFlags e Configurazione di pool speciali.
Usare PoolMon
L'intestazione PoolMon visualizza i byte totali del pool con pagina e non a pagina. Le colonne mostrano l'uso del pool per ogni tag del pool. Il display viene aggiornato automaticamente ogni pochi secondi. Ad esempio:
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 dispone di chiavi di comando che ordinano l'output in base a vari criteri. Selezionare la lettera associata a ogni comando per ricorrere ai dati. Richiede alcuni secondi per il funzionamento di ogni comando.
I comandi di ordinamento includono:
Chiave di comando | Operazione |
---|---|
P | Limita i tag visualizzati a byte del pool non a pagina, byte del pool a pagine o entrambi. Premere ripetutamente cicli P attraverso ognuna di queste opzioni, in tale ordine. |
B | Ordina i tag in base all'utilizzo massimo di byte. |
M | Ordina i tag in base alle allocazioni massime di byte. |
T | Ordina i tag alfabeticamente in base al nome del tag. |
E | Determina che la visualizzazione includa i totali paginati e non a pagina nella parte inferiore. |
A | Ordina i tag in base alle dimensioni dell'allocazione. |
F | Ordina i tag in base alle operazioni gratuite. |
S | Ordina i tag in base alla differenza tra allocazioni e liberi. |
D | Chiude PoolMon. |
Visualizzare i nomi dei driver in PoolMon
È possibile usare il parametro PoolMon /g per visualizzare i nomi dei componenti di Windows e i driver comunemente usati che assegnano ogni tag di 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 mostra l'uso del parametro /g per aggiungere la colonna Mapped_Driver.
poolmon /g "C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\triage\pooltag.txt"
Visualizzare pool specifici
Usare il parametro /i per visualizzare i tag del pool che iniziano con una stringa specifica, ad esempio 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]
Usare l'utilità PoolMon per trovare una perdita di memoria
Ecco un approccio per trovare una perdita di memoria con l'utilità PoolMon:
Avviare PoolMon.
Se è stato determinato che la perdita si verifica in un pool non a pagina, selezionare P una volta. Se è stato determinato che si sta verificando in un pool di pagine, selezionare P due volte. Se non si conosce, non selezionare P, quindi sono inclusi entrambi i tipi di pool.
Selezionare B per ordinare la visualizzazione in base all'uso massimo di byte.
Avviare il test. Copiare l'output dalla schermata, ad esempio prendendo uno screenshot e salvandolo.
Acquisire una nuova schermata ogni mezz'ora. Confrontando gli screenshot, determinare quali byte del tag aumentano.
Arrestare il test e attendere alcune ore. Determinare la quantità di tag liberata in questo momento.
In genere, dopo che un'applicazione raggiunge uno stato di esecuzione stabile, alloca memoria e libera memoria allo stesso tasso. Se alloca la memoria più velocemente di quanto lo libera, l'uso della memoria aumenta nel tempo. Questo spesso indica una perdita di memoria.
Risolvere la perdita
Dopo aver determinato quale tag di pool è associato alla perdita, potrebbe essere necessario conoscere la perdita. Se è necessario determinare quale istanza specifica della routine di allocazione causa la perdita, vedere Uso del debugger del kernel per trovare perdite di memoria in modalità kernel.