2008-12-22 30 views
6

Tengo un código en MS VC++ 6.0 que estoy depurando. Por alguna razón, en este cierto punto en el que estoy tratando de eliminar alguna memoria asignada dinámicamente, se rompe y aparece un mensaje emergente que dice "User Breakpoint llamado desde el código en blah blah". Aparece entonces la ventana Desarmado y veoPunto de interrupción del usuario de ninguna parte

*memory address* int  3 

lo curioso es, no hay ningún lugar en el código que estoy llamando una instrucción de montaje como este (creo asm int 3 es un comando break hardware para x86?) ..

lo podría estar causando esto?

EDITAR: RESPUESTA: Mi código era "caminar desde el final" de una matriz, pero solo en las ubicaciones marcadas por Visual Studio depurar con 0xFDFDFDFD, que se llama valla NoMan'sLand .. Creo que también se llama Error uno por uno ... Esta matriz no estaba relacionada con el punto donde estaba liberando la memoria cuando ocurrió el error. Lo que hacía más difícil de detectar .. :(

+0

Simplemente curioso: ¿lo encontraste siguiendo las instrucciones de ensamblaje para descubrir lo que no le gustaba al montón de depuración o ayudaba alguna otra herramienta/técnica? –

+0

Miré este sitio http://www.highprogrammer.com/alan/windev/visualstudio.html que decía: que 0xFDFDFDFD era un valor de memoria que el depurador MSVC++ usaba para indicar un límite en una matriz para detectar off-by- un error ... Verifiqué mis punteros y solo hice un paso a través de las iteraciones en el ... – krebstar

+0

código fuente y descubrí que no había delimitado correctamente una de mis matrices ... Así que supongo que fue solo un caso en el que tuve que verificar mis punteros correctamente :) – krebstar

Respuesta

8

Probablemente se esté golpeando código en las rutinas montón de depuración que han encontrado daños en el montón.

que se ve el pila de llamadas como cuando has llegado a la Int 3 ?

Editar: Con base en el seguimiento de pila en sus comentarios, la rutina _CrtIsValidHeapPointer() está diciendo que el puntero de ser liberado es malo He aquí el fragmento de código de fuente DBGHEAP.C de MSVC:.

/* 
    * If this ASSERT fails, a bad pointer has been passed in. It may be 
    * totally bogus, or it may have been allocated from another heap. 
    * The pointer MUST come from the 'local' heap. 
    */ 
    _ASSERTE(_CrtIsValidHeapPointer(pUserData)); 

pUserData sería ser el val del puntero que está borrando.

+0

NTDLL! 7c90120e() NTDLL! 7c95d454() NTDLL! 7c96c5cf() NTDLL! 7c9603b0() KERNEL32! 7c85f8d7() – krebstar

+0

_CrtIsValidHeapPointer (void const * 0x04880068) línea 1697 _free_dbg_lk (void * 0x04880068, int 1) línea 1044 + 9 bytes _free_dbg (void * 0x04880068, int 1) línea 1001 + 13 bytes operador delete (void * 0x04880068) línea 351 + 11 bytes – krebstar

+0

Algo así ... – krebstar

3

(creo asm int 3 es una ruptura de hardware de comandos para x86?

Es. Se llama "punto de interrupción de hardware". Si está utilizando el depurador de VS con el código fuente del proyecto, es como un punto de interrupción (pero en el código). Desde vs2005, si su aplicación se inicia sin ningún depurador, la aplicación simplemente se bloqueará, como si lanzara una excepción no administrada.

En lote de compa ny, hay una macro simple utilizada para agregar ese punto de interrupción en el código. Que puede sustituir afirma y excepciones en algunos casos (duras y poco frecuentes):

#define BREAKPOINT __asm { int 3; } 

BREAKPOINT; 

Ver:

por lo que sugiero en busca de alguna macro o un objeto haciendo esto, o tal vez se anexa en un módulo (dll/lib) que no tiene el código de?

+0

Sí, hay un poco de dll/lib abierto en el programa, y ​​no tengo el código fuente para él. Sin embargo, no creo que esta sea la causa ... Michael Burr parece más probable ... Gracias de todos modos :) – krebstar

Cuestiones relacionadas