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:
Inicie PoolMon.
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.
Seleccione B para ordenar la presentación por uso máximo de bytes.
Inicie la prueba en cuestión. Copie la salida de la pantalla, por ejemplo, tomando una captura de pantalla y guardándola.
Tome una nueva captura de pantalla cada media hora. Al comparar capturas de pantalla, determine qué bytes de etiqueta aumentan.
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.