Uso de la clase PHD para aislar pérdidas de memoria

Seleccione idioma Seleccione idioma
Id. de artículo: 194655 - Ver los productos a los que se aplica este artículo
Este artículo se ha archivado. Se ofrece "tal cual" y no se volverá a actualizar.
Expandir todo | Contraer todo

En esta página

Resumen

Pérdidas de memoria son un problema en muchas aplicaciones. Una forma concreta de determinar las pérdidas de memoria es utilizar la clase de C++ PHD que se proporciona en este artículo. Iniciando las estadísticas de memoria en una aplicación mediante la clase PHD, puede obtener una idea más precisa de dónde se produce una pérdida de memoria.

El PHD.EXE autoextraíble es un ejemplo que muestra cómo utilizar el PHD incluye clases para demostrar/disprove una pérdida de memoria. La clase PHD es un envoltorio alrededor de las funciones de Ayuda de rendimiento del kit de recursos de Windows NT. Este código sólo funciona en Windows NT.

Más información

Los archivos siguientes están disponibles para descargarlos del Centro de descarga de Microsoft:
Phd.exe
Fecha de lanzamiento: 23-Oct-1998

Para obtener información adicional acerca de cómo descargar los archivos de soporte técnico de Microsoft, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
119591Cómo obtener Archivos de soporte técnico de Microsoft desde los servicios en línea
Microsoft exploró este archivo en busca de virus. con el software de detección de virus más reciente disponible en la fecha de publicación. Asimismo, el archivo se almacenó en servidores seguros que ayudan a impedir la realización de cambios no autorizados.
En el ejemplo se incluyen los siguientes archivos claves:
    FileName                Description
    ---------------------------------------------------------
   PDH.dll                  Contains helper functions used by PHD.
   RKLeak.cpp               Contains the code for the PHD class.
   RKLeak.h                 Header file for the PHD class.
   TestMain.cpp             A simple program to demonstrate the PHD class.
				

Para utilizar la clase PHD, incluya el archivo RKLeak.cpp en el proyecto. Al incluir el archivo de encabezado, provocará la vinculación a la biblioteca PDH.lib, que acompaña a la Visual C++ 6.0. Deberá agregar el archivo PHD.dll a la ruta de acceso por lo que resultará la aplicación.

El archivo TestMain.cpp contiene el siguiente código de ejemplo que muestra cómo utilizar la clase PHD:

Código de ejemplo

   **************************************************
   #include "rkLeak.h"

   void main()
   {

      char *myCntrs[]={
         "\\Memory\\Available bytes",
         "\\Memory\\committed bytes",
         "\\Memory\\pool Paged bytes",
         "\\Memory\\pool Nonpaged bytes",
      };

      PHD mphd2(myCntrs,sizeof(myCntrs)/sizeof(myCntrs[0]));
      PHD mphd;

      const int arSize=4096;
      for (int i=0;i<5;i++){
         double *d = new double[arSize];
         d[0]= 1.;      d[arSize-1] = 2.;  // Force to committed mem.
         mphd.logData(i);
         mphd2.logData(i);
      }

   ***************************************************
				

El primer uso del constructor PHD permite especificar qué elementos desea supervisar. Éstos son los mismos elementos que están disponibles en la aplicación perfmon.exe.

El segundo uso del constructor PHD (sin argumentos) utiliza los siguientes registros de columna predeterminados: bytes privados, bytes de archivo de página, bytes de bloque paginado, grupo no paginados bytes y el trabajo conjunto.

Como puede ver desde el código de ejemplo, la clase PHD se utiliza para poner la API pierde sospechosa en un bucle y llama periódicamente al método PHD::logData. Los datos se registran en el archivo con nombre "< su name>_perf.log EXE" en el directorio actual. Si el archivo de registro resultante muestra un aumento lineal de bytes privados, este aumento no implica una pérdida de memoria en la API, pero simplemente una pérdida de memoria en la aplicación. Si la API se utiliza incorrectamente (por ejemplo, si libera correctamente los recursos asignados por la llamada inicial), los resultados muestran sólo una pérdida de memoria, no una API defectuosa. Para reducir el problema, crear en cuestión la aplicación posible más sencilla que utiliza la API.

Usuarios de Visual C++ 5.x deben comentar las siguientes líneas de RKLeak.h:
   #undef PdhOpenQuery      //          PdhOpenQueryA
   extern "C" long __stdcall
   PdhOpenQuery (
       IN      LPCSTR      szDataSource,
       IN      DWORD       dwUserData,
       IN      HQUERY      *phQuery
   );
				

Otras herramientas

Puede buscar en el Web en páginas de preguntas más frecuentes para obtener información sobre varios depuradores de terceros que pueden ayudarle a encontrar pérdidas de memoria. Por ejemplo, las siguientes preguntas más frecuentes mencionan varios productos:
http://docs.linux.cz/programming/c/www.eskimo.com/~scs/C-faq/q18.2.html
Nota Los productos de terceros aquí descritos están fabricados por proveedores independientes de Microsoft; no ofrecemos ninguna garantía, implícita ni de cualquier otro tipo, con respecto al rendimiento o la confiabilidad de estos productos. También debe tener en cuenta que a veces estos productos pueden realizar informes falsos de pérdidas, pero todavía son herramientas muy útiles.

Además, el montón de C++ API de depuración es una herramienta útil para localizar pérdidas. Son funciones, como _CrtMemDifference() y _CrtMemDumpAllObjectsSince(), que se documentan en el Visual C++ manual del programador en la sección Referencia de la función de depuración. Estas funciones sólo detectan pérdidas de su código y no pérdidas en otros componentes.

(c) 1998 Microsoft Corporation, reservados todos los derechos. Contribuciones por Rick Anderson, Microsoft Corporation.

Propiedades

Id. de artículo: 194655 - Última revisión: sábado, 22 de febrero de 2014 - Versión: 2.5
La información de este artículo se refiere a:
  • Microsoft Visual Studio 6.0 Enterprise
  • Service Pack 3 de Microsoft Visual Studio 97
  • Microsoft Visual C++ 5.0 Professional
  • Microsoft Visual C++ 6.0 Professional
  • Microsoft Visual Basic 5.0 Enterprise Edition
  • Microsoft Visual Basic Enterprise Edition for Windows 6.0
Palabras clave: 
kbnosurvey kbarchive kbmt kbdownload kbfile kbinfo kbsample KB194655 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 194655

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com