Pergunta

Estou a depuração de um software que deixa de funcionar, eventualmente com uma das seguintes mensagens:

1. DAMAGE: after normal block (#24729280) at 0x00D710E0
2. Debug Assertion Failed
   Program: D:\Soft\Test.exe
   File: dbgheap.c
   Line: 1017

   Expression: _BLOCK_TYPE_IS_VALID(phead->nBlockUse)

Este software é realmente velho, mas mudá-lo agora não é uma opção. Ele é escrito em Visual C ++ 6.0. Estamos supondo que é algum tipo de buffer overflow, por isso estamos tentando encontrar maneiras de detectar onde ele está acontecendo.

Eu encontrei informações sobre PageHeap (que parece ser capaz de me dizer o que eu quero) e GFlags , mas parece que eu não posso fazê-lo funcionar.

Eu criei um programa de teste:

char* test;
test = new char[5];
test[5] = 'a';
delete[] test;

que gera um erro:

DAMAGE: after normal block (#55) at 0x1671920

Então, eu tentei ligar PageHeap a ele executando:

gflags.exe /p /enable MemoryTest.exe /full

e, em seguida, executar novamente ele (tanto através do Visual C ++ interface de 6.0 e através do Windows Explorer), o que resultou no mesmo erro.

Então eu tentei compilar a versão de lançamento, e ele correu através do Visual C ++ interface de 6.0 para obter o erro:

User breakpoint called from code at 0x7c90120e

E a partir do Windows Explorer, eu só tenho os de diálogo janelas pedindo-me para enviar um relatório de erros.

O que eu estou ausente?

Foi útil?

Solução

Você pode executar o aplicativo no modo de versão, anexando a Windbg .

  • Ative a gflags (Como você mencionado)
  • Inicie a aplicação na liberação mode.
  • Anexar-lo para Windbg usando a opção Attach to process em Windbg.
  • Configure o caminho correto para PDBs libertação.
  • Recarregar o PDB manualmente usando .reload /f em caso de automática carregamento falha.
  • Execute o caso de uso.

WinDbg iria parar a execução quando ocorre uma exceção. Para cada primeira excepção oportunidade, analisar as razões. Poderia ser um dos erros para acidente.

Outras dicas

Antes de usar GFLAGS / PageHeap eu sugiro que você para verificar se há exceção violação de acesso. Primeiro anexar o processo usando Build-> Iniciar Debug-> Anexar opção processo. Uma vez que é anexado permitir a violação de acesso de exceção, indo para Debug-> Exceções selecionar violação de acesso e selecione a caixa de seleção Parar sempre. Em seguida, verifique se o seu depurador trava quaisquer excepções de violação de acesso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top