Cómo utilizar Pageheap.exe en Windows XP, Windows 2000 y Windows Server 2003

Resumen

Este artículo describe cómo utilizar la herramienta de PageHeap (Pageheap.exe) en Microsoft Windows XP, Microsoft Windows 2000 y Microsoft Windows Server 2003.

Más información

PageHeap.exe establece indicadores de montón de página que ayudan a encontrar los daños relacionados con el montón. También puede ayudar a detectar pérdidas en programas que se ejecutan en sistemas de Windows XP Professional y Windows 2000 Professional Service Pack 2 (SP2).

PageHeap.exe introduce una capa de validación de software (Administrador del montón de la página) entre la aplicación y el sistema que comprueba todas las operaciones de memoria dinámica (asignaciones, libera y otras operaciones del montón). Cuando se habilita el Administrador de montones de página, a continuación, iniciar la aplicación que se está probando bajo un depurador. Si se encuentra un problema, provocará una interrupción del depurador.

Importante: PageHeap.exe no especifique cuál es el error, pero bloqueará el sistema cuando se encuentra un problema. Permite un nivel de comprobación que ya existe en las bibliotecas del sistema Ntdll.dll en SP2 de Windows 2000 Professional y Windows XP Professional. PageHeap.exe no funcionará en versiones anteriores de Microsoft Windows.

Si no se ha iniciado la aplicación que se está probada en un depurador y se encuentra un error, simplemente fallará sin los comentarios.

Conceptos

Un problema común en el desarrollo de aplicaciones es daños en el montón. Esto suele ocurrir cuando una aplicación asigna un bloque de memoria del montón de un tamaño determinado y, a continuación, escribe en direcciones de memoria más allá del tamaño solicitado del bloque del montón. Daños en el montón también pueden producirse cuando una aplicación escribe en el bloque de memoria que ya ha sido liberada.

Dos conceptos son fundamentales para comprender los comandos relacionados con Pageheap.exe y la manera de utilizarla:
  • Daños en los bloques del montón se descubren colocando una página no accesible al final de la asignación o comprobando tramas de relleno cuando se libera el bloque.
  • Hay dos montones (montones de página completa y montón de página normal) para cada montón creado dentro de un proceso que tiene habilitado el montón de página.
    • Montones de página completa revela daños en bloques del montón colocando una página no accesible al final de la asignación. La ventaja de este enfoque es que lograr "muerte súbita", lo que significa que el proceso tendrán acceso infringen (AV) exactamente el momento del error. Este comportamiento facilita la depuración de errores. La desventaja es que cada asignación utiliza al menos una página de memoria asignada. Para un proceso intensivo de la memoria, los recursos del sistema pueden ser rápidamente agotados.
    • Montón de página normal puede utilizarse en situaciones donde las limitaciones de memoria quede inutilizable montones de página completa. Tramas de relleno se comprueba cuando se libera un bloque del montón. La ventaja de este método es que reduce drásticamente el consumo de memoria. La desventaja es que sólo se detectó daños cuando se libera el bloque. Esto hace más difícil de depurar errores.

Ubicación de descarga para la herramienta de Pageheap

Para descargar el paquete de herramientas de depuración más reciente, haga clic en el vínculo siguiente:

Seleccione la versión más reciente de las herramientas de depuración. Al instalar las herramientas, seleccionar la
Instalación personalizada y, a continuación, instalar en un directorio con un nombre adecuado. Por ejemplo, instale herramientas de C:\Debug o C:\Debugtools.

Elegir un método para investigar los daños del montón bloque

La mayoría de los daños en los bloques del montón se puede descubrir en una de dos maneras:
  • Montones de página completa: colocar una página no accesible al final de la asignación.
  • Montón de página normal: relleno de verificación patrones cuando obtiene libera el bloque.

Montones de página completa

Montones de página completa deben estar habilitado para procesos individuales o en parámetros limitados para procesos grandes, debido a sus requisitos de memoria alta. No se puede habilitar todo el sistema, porque es difícil evaluar el tamaño de archivo de página requiere. Utilizando un archivo de paginación es demasiado pequeño con montones de página completa de todo el sistema hace que el sistema que no puede arrancar.

La ventaja de montones de página completa es la que causa un proceso acceso infringen (AV) exactamente el momento del error. Esto hace fácil depurar el error. Para poder detectar errores, utilice primero el montón de página normal para determinar el rango donde se están produciendo errores de un proceso y utilizar montones de página completa en los procesos individuales a gran escala de esa clase restringida de asignaciones (es decir, un intervalo de tamaño específico o una biblioteca específica).

Montón de página normal

Montón de página normal puede utilizarse para las pruebas de los procesos a gran escala sin el consumo de memoria alta que montones de página completa requiere. Sin embargo, el montón de página normal retrasa detección hasta que se liberan bloques, lo que dificulta la depuración de errores.

En general, utilizar el montón de página normal para procesos de gran escala iniciales pruebas. A continuación, si se detectan problemas, habilite montones de página completa para una clase restringida de asignaciones en esos procesos.

Montón de página normal puede ser todo el sistema con seguridad habilitada para todos los procesos. Esto es muy útil en bancos de pruebas que realizan la validación general del sistema, en lugar de pruebas de componentes centrados. Montón de página normal también puede habilitarse para un único proceso.

Utilizando GFlags con pila de página de todo el sistema

Se utiliza la herramienta GFlags para habilitar el montón de página de todo el sistema. Para un comando GFlags surta efecto, debe reiniciar el equipo después de emitir el comando.

Para habilitar el montón de página normal de todo el sistema:
  1. Escriba lo siguiente en la línea de comandos:gflags - r + hpa

  2. Reinicie el equipo.
Para deshabilitar el montón de página normal de todo el sistema:
  1. Escriba lo siguiente en la línea de comandos:gflags - r-hpa

  2. Reinicie el equipo.
Nota: No hay otras opciones GFlags son útiles cuando se habilita el montón de la página. Si se habilitan otras opciones que parecen estar relacionados con el montón, pueden introducirse errores del montón de página debido a conflictos entre el Administrador de montones de página y estos indicadores de montón "inofensivo".

Utilizando GFlags con un montón de página de un solo proceso

Puede habilitar el montón de la página supervisar un proceso específico. Para ello, siga estos pasos:
  1. En un símbolo del sistema, cambie al directorio donde instaló las herramientas de depuración.
  2. En el símbolo del sistema, escriba lo siguiente y presione ENTRAR:
    Gflags.exe /p /enable
    lsass.exe
    Nota: Lsass.exe es el nombre del proceso que desea supervisar con la herramienta de Pageheap.
  3. Cuando ya no necesite PageHeap supervisión, deshabilitar el seguimiento. Para ello, escriba lo siguiente en un símbolo del sistema y, a continuación, presione ENTRAR:
    Gflags.exe /p /disable lsass.exe
    Nota: Lsass.exe es el nombre del proceso que desea supervisar con la herramienta de Pageheap.
  4. Para obtener una lista de todos los programas que actualmente tienen comprobación de Pageheap habilitada, escriba lo siguiente en un símbolo del sistema y, a continuación, presione ENTRAR:
    Gflags.exe /p

Asignaciones no alineadas

Los administradores del montón de Windows (todas las versiones) siempre han garantizado que las asignaciones del montón tienen una dirección de inicio es de 8 bytes alineado (en plataformas de 64 bits la alineación es de 16 bytes). El administrador del montón página garantiza el mismo. Esto es imposible, sin embargo, si desea tener el final-de-la-asignación exactamente al final de una página. La asignación exacta del final de la página es necesaria para que un error off-por-un byte desencadenar una lectura o escribir en la página no accesible y causar un error de inmediato.

Si el tamaño solicitado por el usuario para el bloque es no 8 bytes alineado, PageHeap no puede cumplir "Iniciar dirección 8 bytes alineado" y las restricciones "alineado de página de la dirección de extremo". La solución es conocer la primera restricción y hacer el inicio de los bloque 8 bytes alineado. A continuación, utilice una trama de relleno pequeño entre el final del bloque y el inicio de la página no accesible. Este patrón de relleno puede ser de 0 bytes a través de 7 bytes de longitud en arquitecturas de 32 bits. La trama de relleno se comprobarán al libre.

Si la detección inmediata de errores es necesitan para estas asignaciones que si no tiene una trama de relleno al final, hacer que la página Administrador del montón omitir la regla de alineación de 8 bytes y alinear siempre el final de la asignación en un límite de página mediante los parámetros / unaligned y completo . Para obtener más información, consulte el parámetro / unaligned .

Nota: algunos programas hacen suposiciones acerca de la alineación de 8 bytes y dejan de funcionar correctamente con el parámetro / unaligned . Microsoft Internet Explorer es un programa de este tipo.

Páginas sin confirmar para asignaciones de montones de página completa

La implementación de montones de página completa principal compromete a dos páginas para cualquier asignación menor que una página. Una página se utiliza para la asignación de usuario y la otra se realiza no accesible al final del búfer.

Saturaciones del final del búfer pueden detectarse mediante una zona de espacio virtual reservado, en lugar de una página no accesible comprometida. Se produce una excepción de infracción de acceso cuando el proceso toca ese espacio virtual reservado. Este enfoque puede reducir el consumo de memoria hasta en un 50 por ciento. Para obtener más información, consulte el parámetro / Anular .

Inyección de errores

Puede controlar el Administrador de montones de página para que algunas asignaciones deliberadamente erróneos. Esto es útil para simular condiciones de memoria baja sin utilizar todos los recursos del sistema.

Especifique un número entre 1 y 10.000 para representar la probabilidad de que una asignación se producirá un error. El uso de una probabilidad de 10.000 garantiza que producirá un 100 por ciento de las asignaciones. Una probabilidad de 2.000 especifica que aproximadamente el 20 por ciento de las asignaciones se producirá un error.

El administrador del montón página toma especial cuidado para evitar la inyección de errores en ambos los cinco primeros segundos de la vida del proceso y las rutas de código del cargador de Windows NT (para exampole, LoadLibrary, FreeLibrary). Si no es suficiente para permitir que el proceso completar el inicio 5 segundos, a continuación, puede especificar un tiempo de espera al principio del proceso. Para obtener más información, vea el parámetro /fault .

Cuando se utiliza el parámetro /fault y el proceso que se está probando tiene un error, se producirá una excepción. Generalmente, la razón de esto es que la operación de asignación devuelve un valor NULL, y posteriormente la aplicación intenta obtener acceso a la memoria asignada. Porque se produjo un error en la asignación, sin embargo, no se puede tener acceso a la memoria y, por tanto, se produce una infracción de acceso.

El otro motivo que se provoca una excepción es que la aplicación intenta tratar el error de asignación, pero no liberar algunos recursos. Esto se manifiesta como una pérdida de memoria y es más difícil de depurar.

Para ayudar a diagnosticar estos errores, el administrador del montón página conserva un historial de seguimientos de la pila en el momento de la inyección de errores. Estos seguimientos se pueden mostrar con el siguiente comando del depurador:

! -p -f [número de rastros] en el montón

De forma predeterminada la extensión mostrará únicamente los cuatro últimos seguimientos.

Conexión de un depurador automáticamente cuando se inicia la aplicación

Algunas aplicaciones son difíciles de iniciar desde un símbolo del sistema, o se generan a partir de otros procesos. Para estas aplicaciones, especificar que, cada vez que se inician, un depurador se adjuntará automáticamente a ellos. Esto resulta útil si el montón de página está habilitado para que se producen errores de proceso y el montón. Para obtener más información, consulte el parámetro/debug .

PageHeap.exe es eficaz cuando se utiliza para comprobar cualquier proceso de asignación de memoria, incluidas las asignaciones de estilo de C++ new y delete, siempre y cuando las funciones personalizadas de asignación o liberación eventualmente llamar a interfaces de administración de montón de NT (es decir, RtlAllocateHeap, RtlFreeHeap). Hacer se garantizan que las funciones siguientes:
  • Funciona como HeapAlloc, HeapFree, HeapReAlloc: estas funciones se exportan por kernel32.dll y llamada directamente en el NT montón interfaces. Funciona como GlobalAlloc, GlobalFree, GlobalReAlloc: estas funciones se exportan por kernel32.dll y llamar directa o indirectamente a las interfaces de montón de NT.
  • Funciona como LocalAlloc, LocalFree, LocalReAlloc: estas funciones se exportan por kernel32.dll y llamar directa o indirectamente a las interfaces de montón de NT.
  • Funciones malloc, libre, realloc, Mtamaño, expanda: estas funciones se exportan por msvcrt.dll y llamar directa o indirectamente al montón de NT. No se ha sido siempre el caso. El tiempo de ejecución de C que se utiliza para tener una implementación diferente del montón, pero el actual C run-time llama directamente al montón de NT.
  • Nuevosoperadores, Eliminar, [] nueva , Eliminar [] : estas funciones se exportan por msvcrt.dll y llamar directa o indirectamente al montón de NT.
Probablemente, cualquier otro conjunto de asignación o liberación de funciones es un esquema personalizado y no se garantiza que se llame directa o indirectamente en el montón de NT. Sólo inspección de código de origen o que se ejecuta en el depurador puede revelar la implementación real.

Evite utilizar la vinculación estática. Algunas aplicaciones han sido versiones vinculadas estáticamente a la antigua de C runtime. Estas versiones antiguas no llame a las API de montón de Windows NT y Pageheap.exe no puede utilizarse para comprobar estas asignaciones. Vinculación dinámica garantiza que se obtendrá de la biblioteca de tiempo de ejecución C (msvcrt.dll) más reciente.

Clases de errores encontrados por Pageheap.exe

PageHeap.exe detecta la mayoría de los errores relacionados con el montón; Sin embargo, está centrado en los problemas de daños del montón y no se centra en pérdidas. PageHeap.exe ha limitado éxito con la búsqueda de pérdidas de montón, aunque tiene funcionalidad a este destino.

Una de las ventajas de Pageheap.exe es que muchos de los errores se detectan cuando se producen. Por ejemplo, un error off-por-un byte al final de un búfer asignado dinámicamente puede provocar una infracción de acceso instantáneo. Hay algunos tipos de errores que no se puede detectar cuando se producen. En esos casos, el informe de errores se retrasa hasta que se libera el bloque.
  • Puntero de pila no válido: interfaces de montón nivel todos de Win32 y Windows NT toman como primer parámetro un puntero al montón donde debería ocurrir la operación. El administrador del montón página detecta un puntero de pila no válido en el momento en que se realiza la llamada.
  • Puntero de bloque de montón no válido: una vez asignado un bloque, puede utilizarse como un parámetro para varias interfaces, en particular la clase free() de interfaces en el montón. El administrador del montón página detecta inmediatamente un puntero de bloque de montón no válido. Vea depurar errores de página montón un método determinar si la dirección no válida es unos pocos bytes apagado o completamente incorrecta.
  • Acceso sin sincronizar multiproceso al montón: algunas aplicaciones llaman a un montón desde varios subprocesos. Este tipo de escenario requiere un indicador (por el usuario) que se activará si se adquiere un bloqueo de montón. El administrador del montón página detectará este tipo de infracción cuando dos subprocesos intentan llamar a la vez en el montón.
  • Suposiciones acerca de la reasignación de un bloque en la misma dirección: no se garantiza una operación de reasignación para devolver la misma dirección. Esto es especialmente cierto cuando la reasignación reduce el tamaño del bloque. Algunas aplicaciones suponen que reasignarse devolverá la misma dirección. El Administrador de montones de página siempre asigna un nuevo bloque durante la reasignación y libera el bloque anterior. El bloque libre está protegido para acceso de lectura y escritura, y por lo tanto, cualquier acceso a ella producirá una infracción de acceso.
  • Doble liberación: este error, donde los mismos bloques del montón se liberan varias veces, es común en algunas aplicaciones. Esto se detecta inmediatamente por el Administrador de montones de página ya que, en el segundo libre, la voluntad de bloque tiene el encabezado prefijo apropiado y no se encuentra entre los bloques asignados. Vea depurar errores de página montón para formas de analizar el seguimiento de pila de la primera operación libre. Este error puede ser una variante del problema de reasignación porque, cuando la aplicación libera lo que piensa que es la dirección del bloque, ese bloque ya liberado como parte de la reasignación.
  • Acceso de bloque libre después: bloques de memoria liberada se mantienen durante un tiempo por el Administrador de montones de página en un bloque de memoria protegida. Cualquier acceso a los bloques provocará una infracción de acceso. Basado en el principio de "localidad", la mayoría de los problemas se debe detectar si el grupo protegido libre es suficientemente grande. Si el bloque liberado aún está en el grupo protegido, el error se detecta al instante. Sin embargo, si se reutiliza la memoria, hay menos posibilidades de encontrar el error o identificar el código que provocó la.
  • Acceso después del final del bloque asignado: el Administrador de montones de página coloca una página inaccesible inmediatamente después del bloque asignado. Cualquier acceso más allá del final del bloque provocará una infracción de acceso. Algunas aplicaciones esperan que las asignaciones de 8 bytes alineado. Esta característica ha sido apoyada desde Windows NT 3.5 administradores del montón. Un tamaño de solicitud que no es de 8 bytes alineado seguirán recibiendo una dirección alineada de 8 bytes, pero esto deja unos pocos bytes después del final del bloque que todavía son accesibles. Si la aplicación de daña sólo esos pocos bytes, el error será capturado sólo comprobando el patrón del sufijo de bloque cuando se libera el bloque.
  • Acceso antes del inicio del bloque asignado: el Administrador de montones de página puede indicar a través de un indicador configurable para colocar la página inaccesible al principio del bloque, en lugar de al final. Cualquier acceso antes del inicio del bloque provocará una infracción de acceso.
ErrorMontón de página normalMontones de página completa
Puntero de pila no válidoDetectar instantáneamenteDetectar instantáneamente
Puntero de bloque de montón no válidoDetectar instantáneamenteDetectar instantáneamente
Acceso sin sincronizarDetectar instantáneamenteDetectar instantáneamente
Hipótesis sobre dirección de reasignación90% hasta que quede libre realdetectada instantáneamente el 90%
Doble liberacióndetectada instantáneamente el 90%detectada instantáneamente el 90%
Reutilizar después libre90% hasta que quede libre realdetectada instantáneamente el 90%
Acceso después del final del bloqueDetectada al libreDetectar instantáneamente
Acceso antes del inicio del bloqueDetectada al libreDetectar instantáneamente (indicador especial)

Depurar errores de pila de página

Para obtener más información sobre la depuración de errores de montón de página, vea Referencia de herramientas de compatibilidad de aplicaciones disponible dentro de Application Compatibility Toolkit.

Para la sintaxis de Pageheap.exe y ejemplos de cómo utilizar Pageheap.exe, vea Referencia de herramientas de compatibilidad de aplicaciones disponible dentro de Application Compatibility Toolkit.

Para obtener información adicional, consulte el siguiente artículo de Microsoft Knowledge Base:
Propiedades

Id. de artículo: 286470 - Última revisión: 24 ene. 2017 - Revisión: 1

Comentarios