Compartir a través de


Ejemplos de PoolMon

En este tema se incluyen los siguientes ejemplos de uso de PoolMon:

Ejemplo 1: Mostrar y ordenar la salida poolMon

Ejemplo 2: Mostrar nombres de controladores

Ejemplo 3: Detección de pérdida de memoria

Ejemplo 4: Examen de una pérdida de memoria del grupo

Ejemplo 5: Supervisión de una sesión de Terminal Server

Ejemplo 1: Mostrar y ordenar la salida poolMon

En este ejemplo se describen varias maneras de configurar la pantalla PoolMon. De forma predeterminada, PoolMon muestra todas las asignaciones de memoria del kernel en orden alfanumérico por valor de etiqueta. Puede modificar el criterio de ordenación de la presentación en la línea de comandos o mientras se ejecuta PoolMon.

El siguiente comando inicia PoolMon:

poolmon

El siguiente comando inicia PoolMon y ordena la presentación por número de operaciones gratuitas:

poolmon /f

Mientras se ejecuta poolmon, puede usar los comandos en tiempo de ejecución para cambiar la pantalla. Por ejemplo, para ordenar la presentación por número de bytes usados, presione b. Para ordenar por bytes por asignación, presione m.

El siguiente comando inicia PoolMon y muestra solo las asignaciones del grupo no paginado:

poolmon /p

Mientras se ejecuta PoolMon, presione p para alternar las asignaciones del grupo paginado, el grupo no paginado o ambos.

Para iniciar PoolMon y mostrar los datos de las asignaciones con una etiqueta determinada, use el parámetro /i . El comando siguiente muestra las asignaciones con la etiqueta AfdB (la etiqueta usada por afd.sys para los búferes de datos).

poolmon /iAfdB

Para excluir asignaciones con una etiqueta determinada, use el parámetro /x . El comando siguiente muestra todas las asignaciones que no tienen la etiqueta AfdB ;

poolmon /xAfdB

Puede usar un asterisco (*) o un signo de interrogación (?) para especificar un conjunto de etiquetas con los mismos caracteres. El comando siguiente muestra las asignaciones que tienen etiquetas de grupo que comienzan por Afd, la etiqueta utilizada por afd.sys;

poolmon /iAfd*

Un comando de inicio PoolMon puede incluir varios parámetros /i y /x . El comando siguiente muestra las asignaciones que tienen etiquetas que comienzan por etiquetas Aud y cuatro caracteres a partir de Cc, excepto las asignaciones con la etiqueta CcBc ;

poolmon /iAud* /iCc?? /xCcBc

También puede ordenar la presentación de PoolMon por el cambio en un valor entre las actualizaciones. El parámetro /( coloca PoolMon en modo de ordenación por cambio.

El comando siguiente muestra las asignaciones con etiquetas que comienzan por Afd y ordena por el cambio en las asignaciones. Usa el parámetro /a para ordenar por número de asignaciones y el parámetro /) para ordenar por el cambio en el número de asignaciones.

poolmon /iAfd* /( /a

El parámetro /( y las claves de paréntesis son modificadores de alternancia. Cuando PoolMon está en modo de ordenación por cambio, interpreta todos los comandos de ordenación como comandos para ordenar por el cambio en el valor. Si presiona una tecla de paréntesis de nuevo, se ordena por el valor .

Ejemplo 2: Mostrar nombres de controladores

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 la memoria asignada con etiquetas que comienzan por NtF. (Usa el carácter de signo de interrogación (?) como carácter comodín). El parámetro /g agrega la columna Mapped_Driver.

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

También puede copiar el archivo pooltag.txt en la misma ubicación que poolmon. Esto permite este uso.

poolmon /iNtF? /g

La presentación resultante muestra las asignaciones con etiquetas que comienzan en NtF. La columna situada más a la derecha en la pantalla, Mapped_Driver, muestra que la memoria se asignó por ntfs.sys, el controlador para el sistema de archivos NTFS. En este caso, la pantalla es aún más específica, ya que pooltag.txt incluye los archivos de origen para las asignaciones 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 es extensa, pero no es una lista completa de todas las etiquetas usadas en Windows. Cuando una etiqueta que aparece en la pantalla no se incluye en pooltag.txt, PoolMon muestra "Controlador desconocido" en la columna Mapped_Driver de la etiqueta.

En los ejemplos siguientes se muestra este método en un sistema de 32 bits.

El comando siguiente usa el parámetro /i para enumerar las asignaciones con etiquetas que terminan en MEM. El parámetro /g agrega el nombre del controlador a la presentación desde el archivo pooltag.txt.

poolmon /i?MEM /g

La presentación resultante muestra las asignaciones con etiquetas que terminan en MEM. Sin embargo, dado que las etiquetas MEM no se incluyen en pooltag.txt, "Controlador desconocido" aparece en la columna Mapped_Driver en lugar del nombre del controlador.

 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

El comando siguiente inicia PoolMon. Usa el parámetro /i para enumerar las asignaciones con etiquetas que terminan en MEM.

poolmon /i?MEM 

En el comando siguiente se enumeran las asignaciones de etiquetas que comienzan por Ip. Usa el parámetro /g , que usa el contenido del archivo pooltag.txt en la columna Mapped_Driver.

poolmon /iIp* /g

En la presentación resultante, la columna Mapped_Driver contiene datos de los archivos 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]

Ejemplo 3: Detección de pérdida de memoria

En este ejemplo se sugiere un procedimiento para usar PoolMon para detectar una pérdida de memoria.

  1. Inicie PoolMon con los parámetros /p /p ( mostrar solo las asignaciones del grupo paginado) y /b (ordene por el número de bytes).

    poolmon /p /p /b
    
  2. Deje que PoolMon se ejecute durante unas horas. Dado que poolMon de inicio cambia los datos, debe recuperar un estado estable antes de que los datos sean confiables.

  3. Guarde la información generada por PoolMon, ya sea como captura de pantalla o copiándola desde la ventana de comandos y pegandola en el Bloc de notas.

  4. Al volver a PoolMon, presione la tecla p dos veces para mostrar solo las asignaciones del grupo no paginado.

  5. Repita los pasos 3 y 4 aproximadamente cada media hora durante al menos dos horas, cambiando entre el grupo paginado y no paginado se muestra cada vez.

  6. Cuando se complete la recopilación de datos, examine los valores Diff (operaciones de asignación menos operaciones libres) y Bytes (número de bytes asignados menos el número de bytes liberados) para cada etiqueta y observe lo que aumente continuamente.

  7. A continuación, detenga PoolMon, espere unas horas y reinicie PoolMon.

  8. Examine las asignaciones que estaban aumentando y determine si ahora se liberan los bytes. La causa probable es que las asignaciones todavía no se hayan liberado o que hayan continuado aumentando el tamaño.

Ejemplo 4: Examen de una pérdida de memoria del grupo

En el ejemplo siguiente se muestra cómo usar PoolMon para investigar una fuga de memoria de grupo de un controlador de impresora sospechoso. En este ejemplo, PoolMon muestra los datos que Windows recopila sobre las asignaciones de memoria con la etiqueta Dsrd.

Algunos controladores de impresora asignan la etiqueta Drsd cuando asignan objetos de interfaz gráfica de dispositivo (GDI) y memoria asociada. Si un controlador de impresora tiene una fuga de objetos, la memoria asignada con la etiqueta Drsd también se perderá.

Nota Antes de ejecutar los pasos de este ejemplo, asegúrese de que la impresora que usa no se interrumpirá hasta que haya terminado. De lo contrario, los resultados pueden no ser válidos.

En la línea de comandos, escriba lo siguiente:

poolmon /iDrsd

Este comando indica a PoolMon que muestre información de las asignaciones con la etiqueta Drsd. (Las etiquetas de grupo distinguen mayúsculas de minúsculas, así que asegúrese de escribir el comando exactamente como se muestra).

Registre los valores de las columnas Diff y Bytes. En la siguiente presentación de ejemplo, el valor de Diff es 21 y el número de bytes es 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 

Envíe un trabajo a la impresora, espere brevemente a que Windows vuelva a la normalidad y, a continuación, registre los valores de las columnas Diff y Bytes.

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  

Cuando la administración de memoria del controlador de impresora funciona correctamente, el valor de Diff debe volver a su valor original de 21 después de imprimir. Sin embargo, como se muestra en la salida anterior, el valor de Diff se incrementó a 27 y el número de bytes aumentó a 22464. La diferencia entre la salida inicial y posterior significa que seis bloques Drsd, con un total de 4992 bytes, se filtran durante la impresión.

Para obtener más información

Si cree que ha identificado un controlador de fugas, vaya al sitio web de soporte técnico de Microsoft y busque los artículos pertinentes de Knowledge Base o póngase en contacto con el proveedor si se trata de un controlador de terceros.

Ejemplo 5: Supervisión de una sesión de Terminal Server

En este ejemplo se muestran varias maneras de mostrar las asignaciones de los grupos de sesiones de Terminal Services. Muestra el uso del parámetro de línea de comandos /s y los parámetros s, TSSessionID y i en ejecución.

El comando siguiente muestra las asignaciones de todos los grupos de sesiones de Terminal Services. En este ejemplo, el equipo local, que se configura como terminal Server, hospeda las sesiones y los equipos cliente usan la característica Escritorio remoto para conectarse al host.

poolmon /s

En respuesta, PoolMon muestra las asignaciones de todos los grupos de sesión. Tenga en cuenta el título "Toda la información del grupo de sesiones" en el encabezado .

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

Para ver las asignaciones de un grupo de sesiones determinado, escriba el identificador de sesión inmediatamente después del parámetro /s , como se muestra en el siguiente comando. Este comando muestra las asignaciones del grupo de sesiones para la sesión 0 de Terminal Services.

poolmon /s0

En respuesta, PoolMon muestra las asignaciones del grupo de sesiones para la sesión 0 de Terminal Services. Tenga en cuenta el título "Información del grupo de sesión 0" en el encabezado.

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

Para ayudar a determinar qué controladores y componentes asignan memoria del grupo de sesiones, agregue el parámetro /g , como se muestra en el comando siguiente. El parámetro /g agrega una columna Mapped_Driver que muestra los componentes y controladores de Windows que asignan cada etiqueta.

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]

También puede configurar la pantalla del grupo de sesiones de Terminal Services mientras se ejecuta PoolMon. En la tabla siguiente se muestra una serie de comandos en ejecución, en el orden en que se escriben y la presentación poolMon resultante.

La serie comienza con un comando para iniciar PoolMon. Todos los demás parámetros se escriben mientras Se ejecuta PoolMon.

poolmon
Key Resultado Descripción

s

Muestra todos los grupos de sesiones.

s

Muestra los grupos del sistema.

El parámetro s alterna la presentación entre los grupos de sistema y los grupos de sesiones de Terminal Services.

0

Muestra el grupo de sesiones 0.

Puede escribir un identificador de sesión al mostrar los grupos del sistema.

7

Muestra el grupo de sesiones 7.

a

Muestra las asignaciones de grupo para la sesión 7, ordenadas por número de asignaciones.

Todos los parámetros de ejecución estándar son válidos para las pantallas del grupo de sesiones.

0

Muestra las asignaciones de la sesión 0, ordenadas por número de asignaciones.

Las opciones de sesión y ordenación se conservan hasta que se cambian.

s

Muestra los grupos del sistema.

s

Muestra las asignaciones de la sesión 0, ordenadas por número de asignaciones.

La opción de sesión se conserva.

10ENTRAR

Muestra las asignaciones de sesión 1 y, a continuación, muestra las asignaciones de sesión 0.

Sin i, solo puede escribir identificadores de sesión del 0 al 9.

i

Solicita un identificador de sesión de Terminal Server.

10

Muestra las asignaciones de sesión 10.

i

Solicita un identificador de sesión de Terminal Server.

Para mostrar todos los grupos de sesiones, presione i y presione ENTRAR.

ENTRAR

Muestra todos los grupos de sesiones.

Solo los sistemas configurados como terminal Server asignan memoria del grupo de sesiones. Si usa PoolMon para mostrar el grupo de sesiones en un equipo que no es un servidor de Terminal Server o si escribe un identificador de sesión que no existe en Windows, PoolMon no muestra ninguna asignación. En su lugar, muestra solo los encabezados con datos de memoria generales.

El siguiente comando muestra las asignaciones de todos los grupos de sesiones de Terminal Services:

poolmon /s

En la ilustración siguiente se muestra la pantalla PoolMon que daría como resultado si el comando /s se enviara a un equipo que ejecuta Windows XP que no se podía configurar como 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