Debug Visual C ++ problemas de alocação de memória
-
13-09-2019 - |
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?
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.