Utilizar a classe PHD para isolar fugas de memória

Traduções de Artigos Traduções de Artigos
Artigo: 194655 - Ver produtos para os quais este artigo se aplica.
Este artigo foi arquivado. Este artigo é oferecido "tal como está" e deixará de ser actualizado.
Expandir tudo | Reduzir tudo

Nesta página

Sumário

Fugas de memória são um problema em muitas aplicações. Uma forma concreta de determinar fugas de memória consiste em utilizar a classe PHD Visual C++ que é fornecida neste artigo. Iniciando estatísticas de memória numa aplicação utilizando a classe PHD, pode obter uma ideia mais precisa de onde está a ocorrer uma fuga de memória.

PHD.EXE extracção automática é um exemplo que demonstra como utilizar PHD incluído classe para provar/disprove uma fuga de memória. A classe PHD é um wrapper fino à volta de funções de programa auxiliar de desempenho a partir do resource kit do Windows NT. Este código funciona apenas no Windows NT.

Mais Informação

Os ficheiros seguintes estão disponíveis para transferência a partir do Centro de transferências da Microsoft:
Phd.exe
Data de edição: 23-Out de 1998

Para obter informações adicionais sobre como transferir ficheiros de suporte da Microsoft, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
119591Como obter ficheiros de suporte da Microsoft a partir de serviços on-line
Microsoft procedeu de vírus neste ficheiro. Microsoft utilizou o mais recente software de detecção de vírus que estava disponível na data em que o ficheiro foi publicado. O ficheiro é alojado em servidores com segurança avançada que o ajudam a impedir alterações não autorizadas ao ficheiro.
Os ficheiros chaves seguintes estã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 utilizar a classe PHD, inclua o ficheiro RKLeak.cpp no projecto. Ao incluir o ficheiro de cabeçalho, fará com que a ligação à biblioteca PDH.lib, que é fornecido com o Visual C++ 6.0. Também terá de adicionar o ficheiro PHD.dll para o caminho de modo a que a aplicação irá localizar.

O ficheiro TestMain.cpp contém o código de exemplo seguinte demonstra como utilizar 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);
      }

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

A primeira utilização do construtor PHD permite-lhe especificar que produtos que pretende monitorizar. Estes são os mesmos itens disponíveis numa aplicação Perfmon.exe.

A segunda utilização do construtor PHD (sem argumentos) utiliza os registos de coluna predefinido seguinte: bytes privados bytes do ficheiro de página, conjunto paginado bytes, conjunto não paginadas bytes e conjunto de trabalho.

Como pode ver o código de exemplo, a classe PHD é utilizada para colocar a API de fuga suspeita num loop e periodicamente chama o método PHD::logData. Os dados são registados para o ficheiro com nome "< o name>_perf.log EXE" no directório actual. Se o ficheiro de registo resultante mostra um aumento linear de bytes privados, este aumento não implica uma fuga de memória na API, mas apenas uma fuga de memória na aplicação. Se a API for utilizada incorrectamente (por exemplo, por não correctamente libertar recursos atribuídos, a chamada inicial), os resultados apresentados apenas uma fuga de memória, não uma API com problemas. Para restringir o problema, crie a aplicação mais simples possível que a API de exercícios em questão.

Visual C++ 5.x utilizadores necessitam de 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

Pode procurar na Web em páginas de Perguntas mais FREQUENTES para obter informações sobre vários depuradores de outros fabricantes que podem ajudar a localizar fugas de memória. Por exemplo, a seguinte pergunta mais FREQUENTE menciona vários produtos:
http://docs.linux.cz/programming/c/www.eskimo.com/~scs/C-faq/q18.2.html
Nota Os produtos de outro fabricante referido neste artigo são fabricados por fornecedores independentes da Microsoft; a Microsoft oferece nenhuma garantia, expressa ou implícita, relativa ao desempenho ou fiabilidade destes produtos. Também deverá indicar que, por vezes, estes produtos podem relatórios falsos de fugas, mas ainda são muito úteis ferramentas.

Além disso, a pilha de Visual C++ API de depuração é uma ferramenta útil para localizar fugas. Estas incluem funções, tais como _CrtMemDifference() e _CrtMemDumpAllObjectsSince(), que são documentadas no manual do Visual C++ para programadores de na secção de referência de função de depuração. Estas funções só detectar fugas no código e não fugas em outros componentes.

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

Propriedades

Artigo: 194655 - Última revisão: 23 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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes 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