Compartir a través de


Uso de PoolMon para buscar una pérdida de memoria en modo kernel

Si sospecha que hay una pérdida de memoria en modo kernel, puede usar la herramienta PoolMon para determinar qué etiqueta de grupo está asociada a la fuga.

PoolMon (Poolmon.exe) supervisa el uso de memoria del grupo por nombre de etiqueta de grupo. Esta herramienta se incluye en el Kit de controladores de Windows (WDK). Para obtener más información, consulte PoolMon.

Configuración del grupo de GFlags

Algunas opciones de configuración de GFlags, como grupo especial, afectarán a cómo se usan los grupos de memoria. Para obtener más información, consulte GFlags y Configuración de un grupo especial.

Uso de PoolMon

El encabezado PoolMon muestra el total de bytes de grupo paginados y no paginados. Las columnas muestran el uso del grupo para cada etiqueta de grupo. La pantalla se actualiza automáticamente cada pocos segundos. Por ejemplo:

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 tiene claves de comando que ordenan la salida según varios criterios. Seleccione la letra asociada a cada comando para recurrir a los datos. Cada comando tarda unos segundos en funcionar.

Los comandos de ordenación incluyen:

Tecla de comando Operación
P Limita las etiquetas que se muestran a bytes de grupo no paginados, bytes de grupo paginados o ambos. Presionar repetidamente P recorre cada una de estas opciones, en ese orden.
B Ordena las etiquetas por uso máximo de bytes.
M Ordena las etiquetas por asignaciones de bytes máximas.
T Ordena las etiquetas alfabéticamente por nombre de etiqueta.
E Hace que la pantalla incluya los totales paginados y no paginados en la parte inferior.
A Ordena las etiquetas por tamaño de asignación.
F Ordena las etiquetas por operaciones libres.
S Ordena las etiquetas por la diferencia entre las asignaciones y las liberaciones.
Q Sale de PoolMon.

Mostrar nombres de controladores en PoolMon

Puede usar el parámetro PoolMon /g para mostrar los nombres de los componentes de Windows y los controladores usados habitualmente que asignan cada etiqueta de grupo. Si encuentra un problema en las asignaciones con una etiqueta determinada, esta característica le ayuda a identificar el componente o controlador infractor.

Los componentes y controladores se muestran en la columna Mapped_Driver, la columna más a la derecha en la pantalla. Los datos de la columna Mapped_Driver proceden de pooltag.txt, un archivo instalado con el WDK.

El comando siguiente muestra el uso del parámetro /g para agregar la columna Mapped_Driver.

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

Mostrar grupos específicos

Use el parámetro /i para mostrar las etiquetas de grupo que comienzan con una cadena específica, por ejemplo 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]

Uso de la utilidad PoolMon para buscar una pérdida de memoria

Este es un enfoque para encontrar una fuga de memoria con la utilidad PoolMon:

  1. Inicie PoolMon.

  2. Si ha determinado que la fuga se está produciendo en un grupo no paginado, seleccione P una vez. Si ha determinado que se está produciendo en un grupo paginado, seleccione P dos veces. Si no lo sabe, no seleccione P, por lo que se incluyen ambos tipos de grupo.

  3. Seleccione B para ordenar la presentación por uso máximo de bytes.

  4. Inicie la prueba en cuestión. Copie la salida de la pantalla, por ejemplo, tomando una captura de pantalla y guardándola.

  5. Tome una nueva captura de pantalla cada media hora. Al comparar capturas de pantalla, determine qué bytes de etiqueta aumentan.

  6. Detenga la prueba y espere unas horas. Determine la cantidad de la etiqueta que se liberó en este momento.

Normalmente, después de que una aplicación alcance un estado de ejecución estable, asigna memoria y memoria libre a la misma velocidad. Si asigna memoria más rápido de lo que libera, su uso de memoria crece con el tiempo. Esto suele indicar una pérdida de memoria.

Solucionar la fuga

Después de determinar qué etiqueta de grupo está asociada a la fuga, es posible que tenga todo lo que necesita saber sobre la fuga. Si necesita determinar qué instancia específica de la rutina de asignación está causando la pérdida, consulte Uso del depurador de kernel para buscar fugas de memoria en modo kernel.