2011-04-12 18 views
8

No he hecho ningún C++ en un tiempo, pero decidí terminar un gran proyecto en el que estaba trabajando para alguien. Estoy recibiendo el siguiente mensaje de error ahora ...C++ Heap Corruption

CORRUPCIÓN DEL ALMOHADA DETECTADO: después del bloque normal (# 1761) en 0x17DEB940. CRT Detectó que la aplicación escribía en la memoria después del final del almacenamiento intermedio de pila.

He estado revisando todas las funciones que pensé que podría haberlo causado, pero estoy perdido. ¿Hay alguna forma de utilizar las funciones de depuración más avanzadas para cazar esto?

+0

¿Qué plataforma? – Potatoswatter

+0

Lo sentimos, MSVC 2008 –

+0

Gracias. Heh, ¿cuáles son las posibilidades de que Linux, Mac y las respuestas agnósticas se publicaron primero? – Potatoswatter

Respuesta

4

Suena como un error clásico de corrupción de memoria. La plataforma sería información útil. Sin ver su código y su complejidad, hay un par de posibilidades:

  1. Voy a hacer una suposición de que la biblioteca de ejecución sería permitirá añadir llamadas al código de validación montón directamente de su código. Sugeriría que haga llamadas al código de validación de montón en varios lugares en su código para que pueda averiguar dónde va incorrecto. Encontrará el lugar donde el montón va mal y sabrá que estaba bien en la llamada anterior. Siga estrechando esa ventana si necesita y luego revise el código donde ocurre el problema.

  2. Si los mismos pasos corruptas exactamente el mismo lugar en la memoria, usted debería ser capaz de utilizar su depurador para establecer un punto de interrupción (o punto de observación) en la memoria siendo cambiados. Algunos de los esos cambios pueden ser intencionados, pero debe poder averiguar cuál es el culpable.

Es posible utilizar una combinación de los dos, si su código es particularmente complejo o los pasos necesarios para reproducir este son largas - Afinar una sección de código que problemático y luego coloque un punto de interrupción en la memoria en la cual se corrompe

David

1

Intenta atraparlo con Intruments.

Suena un poco como un error clásico de C. ¿Estás seguro de que no escribes más allá de una matriz C (como int [xyz]) en un momento o para el ciclo? No causa ningún error, pero se obtienen efectos extraños en muchos espacios que no tienen nada que ver con la parte donde vive el error. : p

2

En Linux yo recomendaría valgrind como una herramienta que le diría exactamente qué salió mal. Puede buscar en algunas alternativas de Windows here.

+0

He usado Purify con éxito en Windows, pero es $$$. –

1

Intente utilizar AppVerifier con pageheap normales habilitado. Si a continuación, adjunta un depurador al proceso y tiene una corrupción de montón con un poco de suerte, se romperá en el punto donde el bloque de memoria se corrompe (por un bloqueo de escritura o un subdesbordamiento). Con un poco de esfuerzo también puede obtener una lista de llamadas del código que asigna cada bloque de pila, algo que también puede ayudar a rastrear el error.

El seguimiento de estos errores puede ser complicado, sin embargo, para obtener información detallada, consulte el Advanced Windows Debugging libro que tiene un capítulo completo dedicado al tema.