Usando a classe PHD para isolar vazamentos de memória

Traduções deste artigo Traduções deste artigo
ID do artigo: 194655 - Exibir os produtos aos quais esse artigo se aplica.
Este artigo foi arquivado. É oferecido "como está" e não será mais atualizado.
Expandir tudo | Recolher tudo

Neste artigo

Sumário

Vazamentos de memória são um problema em muitos aplicativos. Uma forma concreta de determinar vazamentos de memória é usar a classe PHD Visual C++ que é fornecida neste artigo. Fazendo as estatísticas de memória em um aplicativo usando a classe PHD, você pode ter uma idéia mais precisa de onde está ocorrendo um vazamento de memória.

PHD.EXE auto-extraível é um exemplo que demonstra como usar o PHD incluído classe para provar/disprove um vazamento de memória. A classe PHD é um wrapper estreito ao redor as funções do auxiliar de desempenho do Windows NT resource kit. Esse código funciona somente no Windows NT.

Mais Informações

Os seguintes arquivos estão disponíveis para download no Centro de download da Microsoft:
Phd.exe
Data de lançamento: 23-out-1998

Para obter informações adicionais sobre como baixar arquivos de suporte da Microsoft, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
119591Como obter arquivos de suporte da Microsoft a partir de serviços online
Microsoft examinou esse arquivo em busca de vírus. Microsoft utilizou o mais recente software de detecção de vírus que estava disponível na data em que o arquivo foi publicado. O arquivo é armazenado em servidores com segurança avançada que ajudam a evitar qualquer alteração não autorizada no arquivo.
Os seguintes arquivos chaves são incluídos no exemplo:
    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 usar a classe PHD, inclua o arquivo RKLeak.cpp no seu projeto. Incluindo o arquivo de cabeçalho, você fará com que a ligação para a biblioteca PDH.lib, que acompanha o Visual C++ 6.0. Você também precisa adicionar o arquivo PHD.dll ao seu caminho para que o aplicativo irá encontrá-lo.

O arquivo TestMain.cpp contém o seguinte código de exemplo que demonstra como usar a classe PHD:

Código de exemplo

   **************************************************
   #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);
      }

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

O primeiro uso do construtor PHD permite que você especifique quais itens você deseja monitorar. Esses são os mesmos itens que estão disponíveis no aplicativo Perfmon.exe.

O segundo uso de construtor PHD (argumentos) usa os seguintes logs de coluna padrão: bytes particulares, bytes de arquivo de página, bytes de pool paginada, pool não paginadas bytes e conjunto de trabalho.

Como você pode ver do código de exemplo, a classe PHD é usada para colocar a API de vazamento suspeita em um loop e chama o método PHD::logData periodicamente. Os dados serão registrados em arquivo com nome "< seu name>_perf.log EXE" no diretório atual. Se o arquivo de log resultante mostra um aumento linear em bytes particulares, esse aumento não implica um vazamento de memória na API, mas simplesmente um vazamento de memória no aplicativo. Se a API for usada incorretamente (por exemplo, para liberar recursos alocados por chamada inicial não corretamente), os resultados mostram apenas um vazamento de memória, não uma API com defeito. Para restringir o problema, crie o aplicativo possível mais simples que exercita a API em questão.

Os usuários do Visual C++ 5.x precisam comentar as seguintes linhas de RKLeak.h:
   #undef PdhOpenQuery      //          PdhOpenQueryA
   extern "C" long __stdcall
   PdhOpenQuery (
       IN      LPCSTR      szDataSource,
       IN      DWORD       dwUserData,
       IN      HQUERY      *phQuery
   );
				

Outras ferramentas

Você pode pesquisar na Web em páginas de perguntas FREQÜENTES para obter informações sobre vários depuradores de terceiros pode ajudar você a localizar vazamentos de memória. Por exemplo, o FAQ a seguir menciona vários produtos:
http://docs.linux.cz/programming/c/www.eskimo.com/~scs/C-faq/q18.2.html
Observação Os produtos de terceiros analisados aqui são fabricados por fornecedores independentes da Microsoft; não oferecemos garantia, implícita ou não, em relação ao desempenho ou à confiabilidade desses produtos. Você também deve observar que, às vezes, esses produtos podem fazer relatórios falsos de vazamentos de, mas eles ainda são ferramentas muito úteis.

Além disso, a pilha do Visual C++ depuração API é uma ferramenta útil para localizar vazamentos. Incluem funções, como _CrtMemDifference() e _CrtMemDumpAllObjectsSince(), que estão documentadas no guia do programador de C++ Visual na seção Debug funções. Essas funções somente detectar vazamentos em seu código e não os vazamentos em outros componentes.

(c) Microsoft Corporation 1998, todos os direitos reservados. Contribuições de Rick Anderson, Microsoft Corporation.

Propriedades

ID do artigo: 194655 - Última revisão: sábado, 22 de fevereiro de 2014 - Revisão: 2.5
A informação contida neste artigo aplica-se a:
  • Microsoft Visual Studio 6.0 Enterprise Edition
  • Microsoft Visual Studio 97 Service Pack 3
  • Microsoft Visual C++ 5.0 Professional Edition
  • Microsoft Visual C++ 6.0 Professional Edition
  • Microsoft Visual Basic 5.0 Enterprise Edition
  • Microsoft Visual Basic Enterprise Edition for Windows 6.0
Palavras-chave: 
kbnosurvey kbarchive kbmt kbdownload kbfile kbinfo kbsample KB194655 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 194655

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