En Visual Studio, todos hemos tenido "baadf00d", hemos visto "CC" y "CD" al inspeccionar variables en el depurador en C ++ durante el tiempo de ejecución.
Por lo que entiendo, "CC" está en modo DEPURACIÓN solo para indicar cuando una memoria ha sido nueva () o alloc () y unitilializada. Mientras que "CD" representa la memoria eliminada o liberada. Solo he visto "baadf00d" en la versión RELEASE (pero puedo estar equivocado).
De vez en cuando, nos encontramos en una situación de tackeo de pérdidas de memoria, desbordamientos de búfer, etc. y este tipo de información es útil.
¿Alguien sería tan amable de señalar cuándo y en qué modos la memoria está configurada en patrones de bytes reconocibles para fines de depuración?
debugging
visual-c++
HidekiAI
fuente
fuente
Respuestas:
Este enlace tiene más información:
http://en.wikipedia.org/wiki/Magic_number_(programming)
fuente
BAADF00D
(mala comida),BEEFCACE
(pastel de carne),BAADCAB1E
(cable malo),BADCAFE
(café malo) yDEADDEAD
(muerto muerto). ¿Es esto intencional?0xDEADBEEF
,0xC0EDBABE
también clásicos incluso si no caen en la lengua vernácula de la EMBEA71E5
En realidad, hay bastante información útil agregada a las asignaciones de depuración. Esta tabla es más completa:
http://www.nobugs.org/developer/win32/debug_crt_heap.html#table
fuente
Con respecto
0xCC
y0xCD
, en particular, estos son reliquias de la Intel 8088 / 8086 volver conjunto de instrucciones del procesador en la década de 1980.0xCC
es un caso especial del código de operación de interrupción de software . La versión especial de un solo byte permite que un programa genere interrupción 3 .INT
0xCD
0xCC
Aunque los números de interrupción de software son, en principio, arbitrarios,
INT 3
se usaban tradicionalmente para la función de interrupción o punto de interrupción del depurador , una convención que se mantiene hasta nuestros días. Cada vez que se inicia un depurador, instala un controlador de interrupciones para que, cuando se ejecute ese código de operación, se active el depurador. Por lo general, pausará la programación actualmente en ejecución y mostrará un mensaje interactivo.INT 3
Normalmente, el
INT
código de operación x86 tiene dos bytes:0xCD
seguido del número de interrupción deseado de 0-255. Ahora si bien se puede emitir0xCD 0x03
paraINT 3
, Intel decidió añadir un especial version--0xCC
sin byte adicional - porque un código de operación debe ser solamente un byte con el fin de funcionar como un fiable 'relleno de bytes' para la memoria no utilizada.El punto aquí es permitir una recuperación elegante si el procesador salta por error a la memoria que no contiene las instrucciones previstas . Las instrucciones de varios bytes no son adecuadas para este propósito, ya que un salto erróneo podría aterrizar en cualquier posible desplazamiento de bytes donde tendría que continuar con un flujo de instrucciones correctamente formado.
Obviamente, los códigos de operación de un byte funcionan trivialmente para esto, pero también puede haber excepciones extrañas: por ejemplo, considerando la secuencia de relleno
0xCDCDCDCD
(también mencionada en esta página), podemos ver que es bastante confiable ya que no importa dónde aterrice el puntero de instrucción ( excepto quizás el último byte llenado), la CPU puede reanudar la ejecución de una instrucción válida x86 de dos bytesCD CD
, en este caso para generar la interrupción de software 205 (0xCD).Aún más extraño, mientras que
CD CC CD CC
es 100% interpretable, dando cualquieraINT 3
oINT 204
- la secuenciaCC CD CC CD
es menos confiable, solo el 75% como se muestra, pero generalmente el 99,99% cuando se repite como un relleno de memoria de tamaño int.Referencia de ensamblador macro , 1987
fuente
NOP
? ¿No sería suficiente ingresar un solo0xCC
byte con eleb
comando (ingresar bytes)?