Pregunta

Estoy depuración de un software que se estrella con el tiempo con uno de los siguientes mensajes:

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 es muy viejo pero cambiando ahora no es una opción. Está escrito en Visual C ++ 6.0. Estamos supongo que es algún tipo de desbordamiento de búfer, por lo que estamos tratando de encontrar maneras de detectar dónde está sucediendo.

He encontrado información sobre PageHeap (que parece ser capaz de decirme lo que quiero) y GFlags , pero parece que no puedo hacer que funcione.

He creado un programa de prueba:

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

lo que plantea un error:

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

A continuación, he intentado unir a PageHeap ejecutando:

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

y después de volver a ejecutar ella (tanto a través de Visual interfaz C ++ 6.0 y a través de la Windows Explorer), lo que resultó en el mismo error.

Luego trató de compilar la versión de lanzamiento, y corrieron a través de la interfaz de Visual C ++ 6.0 para obtener el error:

User breakpoint called from code at 0x7c90120e

Y desde el explorador de Windows, acabo de recibir el cuadro de diálogo de Windows me pide que envíe un informe de error.

¿Qué me falta?

¿Fue útil?

Solución

Puede ejecutar la aplicación en modo de lanzamiento al unirse a WinDbg .

  • Habilitar la gflags (Como mencionado)
  • Para comenzar la aplicación en la liberación de modo.
  • adjuntarlo a WinDbg utilizando la opción Attach to process en WinDbg.
  • Configurar la ruta correcta para liberar PDBs.
  • Actualizar el AP utilizando manualmente .reload /f en caso de automática carga de falla.
  • Realizar el caso de uso.

WinDBG sería detener la ejecución siempre que se produce una excepción. Por cada excepción de primera oportunidad, analizar las razones. Podría ser uno de los errores de accidente.

Otros consejos

Antes de utilizar GFLAGS / PageHeap sugiero que compruebe si hay una excepción Violación de acceso. Primero conecte el proceso mediante el uso Generar-> Inicio de Depuración> Adjuntar opción para procesar. Una vez que se fija que el acceso de excepción violación yendo a Debug-> Excepciones Violación de selección de acceso y seleccione la casilla de verificación siempre se detengan. A continuación, compruebe si el depurador capta cualquier excepción de infracción de acceso.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top