it-swarm.com.de

Wie lauten die Speicherzuordnungsdarstellungen in Visual Studio C ++?

In Visual Studio hatten wir alle "baadf00d", haben "CC" und "CD" gesehen, als wir Variablen im Debugger in C++ während der Laufzeit inspizierten.

Soweit ich weiß, befindet sich "CC" nur im DEBUG-Modus, um anzuzeigen, wann ein Speicher neu () oder allokiert () und einheitlich ist. Während "CD" für gelöschten oder freigegebenen Speicher steht. Ich habe nur "baadf00d" in RELEASE Build gesehen (aber ich kann mich irren).

Hin und wieder geraten wir in die Situation, Speicherlecks, Pufferüberläufe usw. zu beheben, und diese Art von Informationen ist nützlich.

Wäre jemand so freundlich, darauf hinzuweisen, wann und in welchen Modi der Speicher für Debugging-Zwecke auf erkennbare Bytemuster eingestellt ist?

208
HidekiAI

Dieser Link enthält weitere Informationen:

http://en.wikipedia.org/wiki/Magic_number_ (programming)

 * 0xABABABAB: Wird von HeapAlloc () von Microsoft verwendet, um nach dem zugewiesenen Heap-Speicher "Niemandsland" -Bytes zu markieren. 
 * 0xABADCAFE: Start auf diesen Wert, um den gesamten freien Speicher zu initialisieren und fehlerhafte Zeiger abzufangen. 
 * 0xBAADF00D: Wird von Microsofts LocalAlloc (LMEM_FIXED) verwendet, um nicht initialisierten zugewiesenen Heap-Speicher zu markieren : Wird von Microsoft .NET als magische Zahl in Ressourcendateien verwendet 
 * 0xCCCCCCCC: Wird von der C++ - Debugging-Laufzeitbibliothek von Microsoft zum Markieren von nicht initialisiertem Stapelspeicher verwendet 
 * 0xCDCDCDCD: Wird von der C++ - Debugging-Laufzeitbibliothek von Microsoft zum Markieren verwendet Nicht initialisierter Heap-Speicher 
 * 0xDDDDDDD: Wird vom C++ - Debugging-Heap von Microsoft zum Markieren des freigegebenen Heap-Speichers verwendet. 
 * 0xDEADDEAD: Ein Microsoft Windows-STOP-Fehlercode, der verwendet wird, wenn der Benutzer den Absturz manuell initiiert. 
 * 0xFDFDFDFD: Wird vom C++ - Debugging-Heap von Microsoft zum Markieren verwendet "Niemandsland" schützt Bytes vor und nach dem zugewiesenen Heapspeicher 
 * 0xFEEEFEEE: Wird von Microsoft HeapFree () zum Markieren des freigegebenen Heapspeichers 
 verwendet.
298
Mark Ingram

Tatsächlich gibt es eine Menge nützlicher Informationen, die den Debug-Zuweisungen hinzugefügt wurden. Diese Tabelle ist vollständiger:

http://www.nobugs.org/developer/win32/debug_crt_heap.html#table

 Adressoffset nach HeapAlloc () nach malloc () während free () nach HeapFree () Kommentare 
 0x00320FD8 -40 0x01090009 0x01090009 0x01090009 0x0109005A Win32-Heap-Info [.0109000] 0x00320FDC -36 0x0109000 0x00180400 Win32-Heap-Info 
 0x00320FE0 -32 0xBAADF00D 0x00320798 0xDDDDDDDD 0x00320448 Ptr zum nächsten CRT-Heap-Block (früher zugewiesen) 
 0x00320FE4 -28 0xBAADF00D 0x00000000 0xDDDDDDDDD Zeit) 
 0x00320FE8 -24 0xBAADF00D 0x00000000 0xDDDDDDDD 0xFEEEFEEE Dateiname von malloc () Aufruf 
 0x00320FEC -20 0xBAADF00D 0x00000000 0xDDDDDDD 0xFEEEFEEE Zeilennummer von malloc 0xFEEEFEEE Anzahl der Bytes für malloc () 
 0x00320FF4 -12 0xBAADF00D 0x00000001 0xDDDDDDDD 0xFEEEFEEE Typ (0 = Freigegeben, 1 = Normal, 2 = CRT-Verwendung usw.) 
 0x00320FF8 -8 0xBAADF00D 0x00000031 0xDDDDDDD 0xFEEEFEEE Anforderungs-Nr., Erhöht sich von 0 
 0x00320FFC -4 0xBAADF00D 0xFDFDFD 0xDDDDDDDD. ] 0x00321000 +0 0xBAADF00D 0xCDCDCDCD 0xDDDDDDDD 0xFEEEFEEE Die 8 gewünschten Bytes 
 0x00321004 +4 0xBAADF00D 0xCDCDCDCD 0xDDDDDDD 0xFEEEFEEE Die 8 gewünschten Bytes 
 0x00321008. 0x0032100C +12 0xBAADF00D 0xBAADF00D 0xDDDDDDD 0xFEEEFEEE Win32-Heap-Zuordnungen werden auf 16 Byte aufgerundet ] 0x00321018 +24 0x00000010 0x00000010 0x00000010 0xFEEEFEEE Win32-Heap-Buch 
 0x0032101C +28 0x00000000 0x00000000 0x00000000 0xFEEEFEEE Win32-Heap-Buchhaltung 
 0x00321020 +32 0x00090051 0x00090051 0x00090051 0xFEEEEE Win32-Heap-0EEEE-Buchhaltung 
 0x00321024. ] 0x00321028 +40 0x00320400 0x00320400 0x00320400 0xFEEEFEEE Win32-Heap-Buchhaltung 
 0x0032102C +44 0x00320400 0x00320400 0x00320400 0xFEEEFEEE Win32-Heap-Buchhaltung 
109
John Dibling

Insbesondere bei 0xCC und 0xCD handelt es sich um Relikte aus dem zurückgesetzten Intel 8088 / 8086-Prozessor-Befehl in den 1980er Jahren. 0xCC ist ein Sonderfall des software interrupt ​​opcodes INT0xCD. Die spezielle Einzelbyte-Version 0xCC ermöglicht es einem Programm, Interrupt 3 zu generieren.

Obwohl Software-Interrupt-Nummern im Prinzip willkürlich sind, wurde INT 3 traditionell für die Funktion debugger break oder breakpoint ​​verwendet, eine Konvention, die bis heute erhalten bleibt. Immer wenn ein Debugger gestartet wird, installiert er einen Interrupt-Handler für INT 3, sodass der Debugger ausgelöst wird, wenn dieser Opcode ausgeführt wird. In der Regel wird die aktuell ausgeführte Programmierung angehalten und eine interaktive Eingabeaufforderung angezeigt.

Normalerweise besteht der x86 INT -Opcode aus zwei Bytes: 0xCD gefolgt von der gewünschten Interrupt-Nummer von 0 bis 255. Obwohl Sie jetzt 0xCD 0x03 für INT 3 ausgeben konnten, hat Intel beschlossen, eine spezielle Version --0xCC ohne zusätzliches Byte hinzuzufügen, da ein Opcode nur einer sein darf Byte, um als zuverlässiges Füllbyte für nicht verwendeten Speicher zu fungieren.

Hier geht es darum, eine ordnungsgemäße Wiederherstellung zu ermöglichen wenn der Prozessor versehentlich in den Speicher springt, der keine beabsichtigten Anweisungen enthält. Mehrbyte-Befehle sind für diesen Zweck nicht geeignet, da ein fehlerhafter Sprung bei jedem möglichen Byte-Versatz landen könnte, bei dem er mit einem ordnungsgemäß ausgebildeten Befehlsstrom fortfahren müsste.

Offensichtlich funktionieren Ein-Byte-Opcodes trivial, aber es kann auch kuriose Ausnahmen geben: Betrachtet man zum Beispiel die Füllsequenz 0xCDCDCDCD (ebenfalls auf dieser Seite erwähnt), können wir feststellen, dass sie ziemlich zuverlässig ist, da nein Unabhängig davon, wo der Befehlszeiger landet (außer vielleicht das letzte gefüllte Byte), kann die CPU die Ausführung eines gültigen Zwei-Byte x86-Befehls fortsetzen CD CD, in diesem Fall zum Erzeugen des Software-Interrupts 205 (0xCD).

Weirder noch, während CD CC CD CC zu 100% interpretierbar ist - entweder INT 3 oder INT 204 - die Sequenz CC CD CC CD ist nur weniger zuverlässig 75%, wie gezeigt, aber im Allgemeinen 99,99%, wenn es als Speicherfüller von mittlerer Größe wiederholt wird.

page from contemporaneous 8088/8086 instruction set manual showing INT instruction
Macro Assembler Reference, 1987

5
Glenn Slayden