Use o utilitário PageHeap para detectar erros de memória em um projeto do Visual C++

Este artigo descreve como usar o utilitário PageHeap para detectar erros de memória em projetos Microsoft Visual C++. As informações neste artigo se aplicam apenas ao código do Visual C++ não gerenciado.

Versão original do produto: Visual C++
Número de KB original: 264471

Resumo

O utilitário PageHeap pode ser habilitado para aplicativos para que todas as mallocalocações e , newe heapAlloc sejam monitoradas automaticamente para erros de memória.

PageHeap1 é um projeto do Visual C++ com vários tipos de erros de memória. Para habilitar PageHeap neste aplicativo de exemplo, digite o seguinte conteúdo da linha de comando:

pageheap /enable pgh.exe 0x01

Em seguida, digite o seguinte conteúdo:

pageheap

Observação

O nome do aplicativo que PageHeap monitora.

Para muitos aplicativos, 0x01 é o único sinalizador que você precisa. Você pode obter mais informações sobre seu uso executando PageHeap com o sinalizador de ponto de interrogação (/?) da linha de comando.

Como o PageHeap funciona

PageHeap retorna um ponteiro para a memória alocada em limites de 8 bytes. O final do ponteiro retornado é seguido por 0 a 7 bytes de proteção (dependendo do tamanho solicitado, 0 bytes a 7 bytes são adicionados para arredondar o tamanho da solicitação para estar em um limite de 8 bytes), seguido por uma página de memória marcada PAGE_NOACCESS (para obter mais informações, consulte VirtualAlloc). Por exemplo:

char * p;
p = new char[5];

PageHeap retorna um ponteiro para os 5 bytes mais três bytes de proteção para composição de um total de 8 bytes, como..... XXX. Se o tamanho da alocação de memória for um múltiplo de oito, não haverá bytes de proteção adicionados ao ponteiro retornado.

Se o final da alocação for substituído, os bytes de proteção serão alterados e PageHeap causará um erro de Violação de Acesso quando a memória é liberada. Se o aplicativo ler ou gravar além da alocação (incluindo os bytes de proteção), ele incorrerá em um erro instantâneo de Violação de Acesso .

Como usar o exemplo PageHeap1

  1. Crie o projeto pgh e execute o pgh.exe.

    Observação

    Você deve fazer um build de versão para PageHeap trabalhar com new ou malloc.

    Inicie o PageHeap1.exe. Há uma caixa de diálogo pop-up.

  2. Na caixa de diálogo, você pode ver uma Caixa de Texto, uma caixa de marcar Do Alloc/Free e três botões, nova exclusão de &, PageAlloc & Heap Free e com nova & COM Delete. O TextBox obtém o tamanho da memória que você deseja ter alocado. Se a caixa de marcar Do Alloc/Gratuito estiver selecionada, cada tipo de alocação (novo, PageAlloc e COM novo) alocará memória e gravará além da alocação. Se o Alloc Ruim não for verificado, nenhuma substituição de memória ocorrerá.

    O botão novo testa o new operador, o botão PageAlloc testa HeapAlloc. O novo COM não usa CoTaskMemAlloc , mas chama uma DLL (biblioteca de link dinâmico) COM que simplesmente chama new. Para testar o COM novo, você deve registrar r1LeakMemMod.dll ou criar o projeto r1LeakMemMod.

    Você pode usar uma biblioteca de DLL em tempo de execução para o PageHeap funcionar. (Do Ambiente de Desenvolvimento Integrado do Visual C++ (IDE), Projetos>Configurações>C++>Categoria: Geração> de CódigoUse a biblioteca de tempo de execução).

  3. Depois de verificar a caixa de Alloc/Gratuito Ruim, se o tamanho da alocação de memória for de 5 bytes, selecione no novo botão, a memória de 5 bytes será alocada e 0 será gravada no sexto byte. Gravar no sexto byte é uma substituição de memória ilegal, no entanto, ocorre em um byte de proteção para que PageHeap não detecte esse erro até que a memória seja excluída. Ao selecionar o botão excluir, PageHeap detecta a substituição e verá uma caixa de mensagem de erro semelhante ao exemplo a seguir:

    A exceção Ponto de interrupção Um ponto de interrupção foi atingido. (0x80000003) ocorreu no aplicativo no local 0x77f9f9df.

    Se você tiver o Visual C++ especificado como depurador just-in-time (JIT), você poderá selecionar o botão Cancelar e depurar no código.

    Se você alterar o tamanho da alocação para 8 (ou qualquer múltiplo de 8), selecionar botões novos, pageAlloc ou COM Novos resulta em um erro de Violação de Acesso instantâneo porque você escreveu em um endereço sem acesso. (ou seja, você não precisa excluir a memória para detectar o erro).

Observação

  1. Limitações: PageHeap só pode encontrar erros de memória da família (daí o malloc operador newC++ ) e heapAlloc. Muitos aplicativos usam alocadores personalizados e PageHeap não consegue interceptar essas alocações.
  2. Quando você terminar de testar uma execução pageheap /disable <appName> de aplicativo da linha de comando para desativar PageHeap para esse aplicativo.
  3. Aplicativos habilitados para PageHeap podem consumir muito mais memória do que o mesmo aplicativo sem PageHeap habilitado. Talvez seja necessário aumentar o arquivo de troca para atender ao aumento da demanda de memória.

Você pode baixar Pageheap1vcnet.exe aqui. Para obter mais informações sobre como baixar arquivos de suporte da Microsoft, consulte Como obter arquivos de suporte da Microsoft de serviços online.

A Microsoft examinou esse arquivo em busca de vírus. A Microsoft usou o software de detecção de vírus mais atual que estava disponível na data em que o arquivo foi postado. O arquivo é armazenado em servidores aprimorados pela segurança que ajudam a evitar alterações não autorizadas no arquivo.