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:

  1. Avviare PoolMon.

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

  3. Selezionare B per ordinare la visualizzazione in base all'uso massimo di byte.

  4. Avviare il test. Copiare l'output dalla schermata, ad esempio prendendo uno screenshot e salvandolo.

  5. Acquisire una nuova schermata ogni mezz'ora. Confrontando gli screenshot, determinare quali byte del tag aumentano.

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