Como usar Pageheap.exe no Windows XP, Windows 2000 e Windows Server 2003

Traduções deste artigo Traduções deste artigo
ID do artigo: 286470 - Exibir os produtos aos quais esse artigo se aplica.
Expandir tudo | Recolher tudo

Neste artigo

Sumário

Este artigo descreve como usar a heap de página ferramenta (Pageheap.exe) no Microsoft Windows XP, Microsoft Windows 2000 e Microsoft Windows Server 2003.

Mais Informações

Pageheap.exe define sinalizadores de heap de página que ajudam a localizar corrupção de heap. Ele também pode ajudar a detectar vazamentos em programas que estão sendo executados em sistemas Windows XP Professional e Windows 2000 Professional Service Pack 2 (SP2).

Pageheap.exe apresenta uma camada de validação de software (gerente de heap de página) entre o aplicativo e o sistema que verifica todas as operações de memória dinâmica (alocações, libera e outras operações de heap). Quando o Gerenciador de heap de página está habilitado, o aplicativo que está sendo testado, em seguida, é iniciado em um depurador. Se um problema é encontrado, ele fará com que uma quebra de depurador.

importante Pageheap.exe não especificar o que é o bug, mas ele irá falhar o sistema quando um problema é encontrado. Ele permite que uma camada de verificação que já existe nas bibliotecas de sistema Ntdll.dll no Windows 2000 Professional SP2 e no Windows XP Professional. Pageheap.exe não funcionará em versões anteriores do Microsoft Windows.

Se o aplicativo que está sendo testado não é iniciado em um depurador e um bug é encontrado, ele será apenas falhar sem enviar comentários.

Conceitos

Um problema comum no desenvolvimento de aplicativos é a corrupção de pilha. Isso normalmente ocorre quando um aplicativo aloca um bloco de memória de heap de um determinado tamanho e, em seguida, grava endereços de memória além do tamanho solicitado do bloco de heap. Corrupção de pilha também pode ocorrer quando um aplicativo grava bloco de memória que já tinha sido liberada.

Dois conceitos são fundamentais para noções básicas sobre os comandos relacionados a Pageheap.exe e a maneira de usá-lo:
  • Corrupções no heap blocos são descobertas por colocar uma página não acessível no final da alocação de, ou por padrões de preenchimento de verificação quando o bloco é liberado.
  • Há dois heaps (heap de página inteira e heap de página normal) para cada pilha criada dentro de um processo que tem o heap de página ativada.
    • heap de página inteira revela corrupções em blocos de heap, colocando uma página não acessível no final da alocação de. A vantagem dessa abordagem é que você obter "sudden morte", que significa que o processo será acessar violar (VA) exatamente no ponto de falha. Esse comportamento facilita a falhas depurar. A desvantagem é que cada alocação usa pelo menos uma página de memória confirmada. Para um processo que exijam muita memória, recursos do sistema podem ser esgotados rapidamente.
    • heap de página normal pode ser usado em situações onde as limitações de memória inutilizar heap de página inteira. Ele verifica padrões de preenchimento quando um bloco de heap é liberado. A vantagem desse método é que ela reduz drasticamente o consumo de memória. A desvantagem é que danos somente serão detectados quando o bloco é liberado. Isso torna mais difícil de depurar falhas.

Local para a ferramenta Pageheap de download

Para baixar o pacote de ferramentas de depuração mais recente, clique no seguinte link:
http://www.microsoft.com/whdc/devtools/debugging/default.mspx


Selecione a versão mais recente das ferramentas de depuração. Quando você instala as ferramentas, selecionar instalação personalizada e, em seguida, instale um diretório com um nome apropriado. Por exemplo, instale a ferramentas para C:\Debug ou C:\Debugtools.

Escolhendo um método de Investigate corrupções de bloco de heap

A maioria dos danos em blocos de heap pode ser descoberta em uma das duas maneiras:
  • Heap de página inteira: colocar uma página não acessível no final da alocação de.
  • Heap de página normal: verificar preencher padrões quando o bloco é liberado.

Heap full-Page

Heap de página inteira deve ser habilitada para processos individuais ou em parâmetros limitados para grandes processos, devido a seus requisitos de memória alta. Ele não pode ser habilitado todo o sistema, pois é difícil avaliar o tamanho do arquivo página necessária. Usando um arquivo de página é muito pequeno com heap de página inteira de todo o sistema processa o sistema não inicializável.

A vantagem de heap de página inteira é que ele faz com que um processo de acesso violar (VA) exatamente no ponto de falha. Isso facilita a falha depurar. Para ser capaz de identificar falhas, primeiro usar o heap de página normal para determinar o intervalo onde um processo está falhando e, em seguida, usar heap de página inteira em processos individuais em larga escala para essa classe restrita de alocações (ou seja, um intervalo de tamanho específico ou uma biblioteca específica).

Heap de página normal

Heap de página normal pode ser usado para o teste de processos em larga escala sem o consumo de memória alta esse heap de página inteira requer. No entanto, a heap de página normal atrasa detecção até que blocos são liberados, tornando assim falhas mais difícil depurar.

Em geral, use o heap de página normal para processos em larga escala iniciais de teste. Em seguida, se forem detectados problemas, habilite heap de página inteira para uma classe restrita de alocações nesses processos.

Heap de página normal pode ser todo o sistema com segurança habilitado para todos os processos. Isso é muito útil em benches de teste que executam validação gerais do sistema em vez de teste do componente focalizado. Heap de página normal também pode ser habilitado para um único processo.

Com GFlags sistema Wide Heap de página

A ferramenta GFlags é usada para habilitar o heap de página de todo o sistema. Em ordem para um comando GFlags entrem em vigor, reinicie o computador após emitir o comando.

Para habilitar a heap de página normal de todo o sistema:
  1. Digite o seguinte na linha de comando: gflags - r + hpa

  2. Reinicie o computador.
Para desativar o heap de página normal de todo o sistema:
  1. Digite o seguinte na linha de comando: gflags - r - hpa

  2. Reinicie o computador.
Observação Outras configurações de GFlags são úteis quando você ativar o heap de página. Se outras configurações que parecem estar relacionados a pilha estiverem ativadas, os bugs de heap de página podem ser introduzidos devido a conflitos entre esses sinalizadores de heap "inofensivo" e o Gerenciador de heap de página.

Usando GFlags com um único heap de página de processo

Você pode habilitar o heap de página monitorar um processo específico. Para fazer isso, execute as seguintes etapas:
  1. Em um prompt de comando, altere o diretório onde você instalou as ferramentas de depuração.
  2. No prompt de comando, digite o seguinte e pressione ENTER:
    Gflags.exe /p /enable lsass.exe
    Observação lsass.exe significa o nome do processo que você deseja monitorar com a ferramenta Pageheap.
  3. Quando você não precisa mais monitoramento de heap de página, desative o monitoramento. Para fazer isso, digite o seguinte em um prompt de comando e pressione ENTER:
    Gflags.exe /p /disable lsass.exe
    Observação lsass.exe significa o nome do processo que você deseja monitorar com a ferramenta Pageheap.
  4. Para listar todos os programas que atualmente têm Pageheap verificação ativada, digite o seguinte em um prompt de comando e pressione ENTER :
    Gflags.exe /p

Alocações unaligned

Os gerenciadores de heap do Windows (todas as versões) sempre tem garantido que as alocações de heap tem um endereço inicial que é alinhado de 8 bytes (em plataformas de 64 bits o alinhamento é 16 bytes). O Gerenciador de heap de página garante o mesmo. Isso é impossível, no entanto, se você quiser ter a end-de-a-alocação exatamente no final de uma página. A alocação exata do final da página é necessário para que um erro de logoff-por-byte disparar uma leitura ou gravação para a página não acessível e causar uma falha de imediata.

Se o tamanho usuário solicitou o bloco é 8 bytes não alinhados, heap de página não é possível atender "Iniciar endereço 8 bytes alinhado" tanto as restrições "end endereço de página alinhados". A solução é atender a restrição primeira e fazer o início do bloco de 8 bytes alinhados. Use um padrão de preenchimento pequenos entre o final do bloco e o início da página não acessível. Esse padrão de preenchimento pode ser de 0 bytes por meio de 7 bytes de comprimento em arquiteturas de 32 bits. O padrão de preenchimento é verificado após livre.

Se a detecção de falhas imediata é necessária para essas alocações caso contrário, terá um padrão de preenchimento no final, verifique o Gerenciador de heap de página ignorar a regra de alinhamento de 8 bytes e sempre alinhar o fim da alocação em um limite de página usando os parâmetros / unaligned e / completo . Para obter mais informações, consulte o parâmetro / unaligned .

Observação : alguns programas fazem suposições sobre o alinhamento de 8 bytes e eles param de funcionar corretamente com o parâmetro / unaligned . O Microsoft Internet Explorer é um programa desse tipo.

Páginas não confirmadas para Full-Page alocações de heap

A implementação de heap de página inteira principal confirma duas páginas para qualquer alocação menor do que uma página. Uma página é usada para a alocação de usuário e a outra é feita que não são acessível no final do buffer.

Saturações de final do buffer podem ser detectadas usando uma zona de espaço reservado virtual, em vez de uma página confirmada não acessível. Uma exceção de violação de acesso ocorre quando o processo toca esse espaço virtual reservado. Essa abordagem pode reduzir o consumo de memória, até 50 por cento. Para obter mais informações, consulte o parâmetro / liberação .

Falha de inserção

Você pode controlar o Gerenciador de heap de página para que algumas alocações são deliberadamente falha. Isso é útil para simular condições de baixa memória sem na verdade, usar todos os recursos do sistema.

Especifique um número entre 1 e 10.000 para representar a probabilidade de uma alocação falhará. O uso de uma probabilidade de 10.000 garante que 100 por cento das alocações falhará. Uma probabilidade de 2.000 Especifica que aproximadamente 20 por cento das alocações falhará.

O Gerenciador de heap de página leva um cuidado especial para evitar a injeção de falha em ambos os primeiros segundos 5 da vida do processo e o Windows NT loader caminhos de código (para exampole, LoadLibrary, FreeLibrary). Se 5 segundos não for suficiente para permitir que o processo concluir a inicialização, você pode especificar um tempo limite maior no início do processo. Para obter mais informações, consulte o parâmetro / Falha .

Quando você usa o parâmetro / Falha e o processo que está sendo testado tem um bug, uma exceção será gerada. Geralmente, o motivo para isso é que a operação de alocação retornou um NULL, e posteriormente o aplicativo tenta acessar a memória alocada. No entanto, porque a alocação falhou, a memória não pode ser acessada e, portanto, ocorre uma violação de acesso.

O outro motivo é levantada uma exceção é que o aplicativo tenta lidar com a falha de alocação, mas não libera alguns recursos. Isso manifesta como um vazamento de memória e é mais difícil depurar.

Para ajudar a diagnosticar essas falhas, o Gerenciador de heap de página mantém um histórico de rastreamentos de pilha a partir do momento de injeção de falha. Esses rastreamentos podem ser exibidos com o seguinte comando de depurador:

! pilha [número de RASTREAMENTOS] -p -f

Por padrão, a extensão exibirá apenas os últimos quatro rastreamentos.

Anexando um depurador automaticamente, quando o aplicativo é iniciado

Alguns aplicativos são difíceis de iniciar a partir de um prompt de comando, ou eles são gerados de outros processos. Para esses aplicativos, especificar que, sempre que forem iniciados, um depurador será anexado automaticamente a elas. Isso é útil se o heap de página estiver ativado para que ocorram falhas de processo e de heap. Para obter mais informações, consulte o parâmetro / debug .

Pageheap.exe é eficaz quando usada para verificar qualquer processo de alocação de memória, incluindo estilo C++ alocações de novas e excluir, contanto que eventualmente chamarem as funções de alocação/liberar personalizado NT pilha interfaces de gerenciamento (isto é, RtlAllocateHeap, RtlFreeHeap). As seguintes funções são garantidas como fazer isso:
  • Funciona como HeapAlloc , HeapFree , HeapReAlloc : essas funções são exportadas pelo kernel32.dll e chamada diretamente para o NT pilha interfaces. Funciona como GlobalAlloc , GlobalFree , GlobalReAlloc : essas funções são exportadas pelo kernel32.dll e chamar as interfaces de heap NT direta ou indiretamente.
  • Funciona como LocalAlloc , LocalFree , LocalReAlloc : essas funções são exportadas pelo kernel32.dll e chamar as interfaces de heap NT direta ou indiretamente.
  • Funções malloc , livre , realocar , msize , expanda : essas funções são exportadas por msvcrt.dll e chamar direta ou indiretamente heap NT. Isso não tem sido sempre o caso. O C tempo de execução usado para ter uma implementação de pilha diferentes, mas as chamadas de tempo de execução C atuais diretamente no heap NT.
  • novos operadores, Excluir , [novo] , Excluir [] : essas funções são exportadas por msvcrt.dll e chamar direta ou indiretamente heap NT.
Qualquer outro conjunto de funções alocação/liberar provavelmente é um esquema personalizado e não é garantido para chamar direta ou indiretamente NT heap. Somente inspeção de código de origem ou em execução em depurador pode revelar a implementação real.

Evite usar a vinculação estática. Alguns aplicativos foram vinculadas estaticamente a antiga versões do tempo de execução C. Essas versões antigas não chamam APIs de heap de Windows NT e Pageheap.exe não pode ser usada para verificar essas alocações de. Vinculação dinâmica garante que você obtenha a biblioteca de tempo de execução C (msvcrt.dll) mais recente.

Classes de erros encontrados pelo Pageheap.exe

Pageheap.exe detecta a maioria dos bugs relacionados a pilha; Entretanto, ele é voltado para problemas de corrupção de heap e não enfoca vazamentos. Pageheap.exe limitou sucesso com Localizando vazamentos de heap, embora ele tem funcionalidade para atingir isso.

Uma das vantagens de Pageheap.exe é que muitos erros são detectados quando eles ocorrem. Por exemplo, um erro de logoff-por-byte no final de um buffer alocado dinamicamente pode causar uma violação de acesso instantâneo. Há alguns tipos de erros que não podem ser detectados quando eles ocorrerem. Nesses casos, o relatório de erros está atrasado até que o bloqueio seja liberado.
  • ponteiro de pilha inválido : All Win32 e Windows NT interfaces de heap nível utilizam como um primeiro parâmetro um ponteiro para a pilha onde a operação deve ocorrer. O Gerenciador de heap de página detecta um ponteiro de pilha inválido no momento que a chamada é feita.
  • ponteiro de bloco de pilha inválido : após um bloco é alocado, ele pode ser usado como um parâmetro para várias interfaces, principalmente a classe free() de interfaces de pilha. O Gerenciador de heap de página imediatamente detecta um ponteiro de bloco de pilha inválido. Consulte depuração página heap falhas para uma maneira de determinar se o endereço inválido é alguns bytes logoff ou está totalmente incorreto.
  • acesso não sincronizado multithread a heap de : alguns aplicativos chamam uma pilha de vários threads. Esse tipo de cenário requer definindo um sinalizador (por usuário) que irá disparar adquirir um bloqueio de heap. O Gerenciador de heap de página irá detectar esse tipo de violação quando dois threads tentarem chamar simultaneamente a pilha.
  • suposições sobre realocação de um bloco no mesmo endereço : uma operação de realocação não é garantida para retornar o mesmo endereço. Isso é especialmente verdadeiro quando a realocação reduz o tamanho do bloco de. Alguns aplicativos pressupõem que realocação retornará o mesmo endereço. O Gerenciador de heap de página sempre aloca um novo bloco durante uma realocação e libera o bloco antigo. O bloco livre está protegido para acesso de leitura/gravação e, portanto, qualquer acesso a ele irá gerar uma violação de acesso.
  • duplo livre : este erro, onde os blocos de heap mesmo são liberados várias vezes, é comum em alguns aplicativos. Isso é detectado imediatamente pelo Gerenciador de heap de página porque, na segunda livre, será o bloco não ter o cabeçalho prefixo adequada e não pode ser encontrado entre os blocos alocados. Consulte depuração página pilha Falhas de formas de analisar o rastreamento da pilha da primeira operação livre. Este erro pode ser uma variante do problema realocação porque, quando o aplicativo libera o que pensa que ele é o endereço do bloco, esse bloco já foi liberado como parte de realocação.
  • acesso do bloco livre após : blocos de memória liberada são mantidos por um curto período de tempo pelo Gerenciador de heap de página em um pool de memória protegida. Nenhum acesso a esses blocos irá gerar uma violação de acesso. Com base no princípio "localidade", a maioria dos problemas deve ser detectada se o pool livre protegido for grande o suficiente. Se o bloco liberado ainda estiver em pool protegido, o bug é detectado instantaneamente. No entanto, se a memória foi reutilizada, em seguida, haverá menos chance de localizar o bug ou identificar o código que deixá-lo.
  • acesso após o final do bloco alocado : O Gerenciador de heap de página coloca uma página inacessível imediatamente após o bloco alocado. Qualquer acesso após o final do bloco irá gerar uma violação de acesso. Alguns aplicativos esperam alocações ser alinhados de 8 bytes. Esse recurso tem oferecido suporte desde gerenciadores de heap do Windows NT 3.5. Um tamanho de solicitação que não está alinhado de 8 bytes ainda terá um endereço de alinhamento de 8 bytes, mas isso deixa algumas de bytes após o final do bloco que ainda podem ser acessados. Se o aplicativo corrompe somente alguns bytes, em seguida, o erro será detectado apenas verificando o bloco de sufixo padrão quando o bloco é liberado.
  • acesso antes do início do bloco alocado : O Gerenciador de heap de página pode ser instruído por meio de um sinalizador pode ser definido para colocar a página inacessível no início do bloco, em vez de no final. Qualquer acesso antes do início do bloco irá gerar uma violação de acesso.
Recolher esta tabelaExpandir esta tabela
FalhaHeap de página normalHeap de página inteira
Ponteiro de pilha inválidoDetectada instantaneamenteDetectada instantaneamente
Ponteiro de bloco de pilha inválidoDetectada instantaneamenteDetectada instantaneamente
Acesso não sincronizadoDetectada instantaneamenteDetectada instantaneamente
Suposição sobre realocação endereço90 % até real livre90 % detectada instantaneamente
Duplo livre90 % detectada instantaneamente90 % detectada instantaneamente
Reutilizar após liberar90 % até real livre90 % detectada instantaneamente
Acesso após o final do blocoDetectada ao livreDetectada instantaneamente
Acesso antes do início do blocoDetectada ao livreDetectada instantaneamente (sinalizador especial)

Depuração falhas de heap de página

Para obter mais informações sobre depuração falhas de heap de página, consulte Application Compatibility Tookit referência disponível dentro do Application Compatibility Toolkit.

Para a sintaxe de Pageheap.exe e exemplos de utilização Pageheap.exe, consulte Application Compatibility Tookit referência disponível dentro do Application Compatibility Toolkit.

Para obter informações adicionais consulte o seguinte artigo:
294895Como obter o Kit de ferramentas de compatibilidade de aplicativo do Windows

Propriedades

ID do artigo: 286470 - Última revisão: quarta-feira, 14 de janeiro de 2009 - Revisão: 6.0
A informação contida neste artigo aplica-se a:
  • Microsoft Windows Server 2003, Standard Edition (32-bit x86)
  • Microsoft Windows Server 2003, Enterprise Edition (32-bit x86)
  • Microsoft Windows Server 2003, Datacenter Edition (32-bit x86)
  • Microsoft Windows XP Professional
  • Microsoft Windows XP Home Edition
  • Microsoft Windows 2000 Professional Edition
  • Microsoft Windows 2000 Server
  • Microsoft Windows 2000 Advanced Server
  • Microsoft Windows 2000 Datacenter Server
Palavras-chave: 
kbmt kbenv kbinfo KB286470 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: 286470

Submeter comentários

 

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