In Visual Studio hatten wir alle "baadf00d", haben "CC" und "CD" gesehen, als wir zur Laufzeit Variablen im Debugger in C ++ überprüft haben.
Soweit ich weiß, befindet sich "CC" nur im DEBUG-Modus, um anzuzeigen, wann ein Speicher neu () oder alloc () und unitilialisiert wurde. 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 praktisch.
Wäre jemand so freundlich, darauf hinzuweisen, wann und in welchen Modi der Speicher für Debugging-Zwecke auf erkennbare Bytemuster eingestellt ist?
debugging
visual-c++
HidekiAI
quelle
quelle
Antworten:
Dieser Link enthält weitere Informationen:
http://en.wikipedia.org/wiki/Magic_number_(programming)
quelle
BAADF00D
(schlechtes Essen),BEEFCACE
(Rindfleischkuchen),BAADCAB1E
(schlechtes Kabel),BADCAFE
(schlechtes Café) undDEADDEAD
(tot tot). Ist das beabsichtigt?0xDEADBEEF
,0xC0EDBABE
auch Klassiker, auch wenn sie nicht in die Umgangssprache der MS fielenBEA71E5
Es gibt tatsächlich eine Menge nützlicher Informationen, die zu Debug-Zuordnungen hinzugefügt werden. Diese Tabelle ist vollständiger:
http://www.nobugs.org/developer/win32/debug_crt_heap.html#table
quelle
In Bezug
0xCC
und0xCD
insbesondere sind diese Relikte aus der Intel 8088 / 8086 - Prozessor - Befehlssatz zurück in den 1980er Jahren.0xCC
ist ein Sonderfall des Software-Interrupt- Opcodes . Die spezielle Einzelbyte-Version ermöglicht es einem Programm, Interrupt 3 zu generieren .INT
0xCD
0xCC
Obwohl Software-Interrupt-Nummern im Prinzip willkürlich sind,
INT 3
wurde sie traditionell für die Debugger-Break- oder Breakpoint- Funktion verwendet, eine Konvention, die bis heute besteht. Jedes Mal, wenn ein Debugger gestartet wird, installiert er einen Interrupt-HandlerINT 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-255. Nun , obwohl Sie könnten ausgeben0xCD 0x03
fürINT 3
Intel ein spezielles version-- hinzuzufügen entschieden0xCC
ohne zusätzliches Byte - weil ein Opcode nur ein Byte, um zu funktionieren als zuverlässiger ‚Füllbytezeiger‘ für nicht genutzte Speicher sein muss.Hier geht es darum, eine ordnungsgemäße Wiederherstellung zu ermöglichen, wenn der Prozessor versehentlich in einen 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, wo er mit einem ordnungsgemäß gebildeten Befehlsstrom fortgesetzt werden müsste.
Offensichtlich funktionieren Ein-Byte-Opcodes hierfür trivial, aber es kann auch eigenartige Ausnahmen geben: Wenn
0xCDCDCDCD
wir beispielsweise die Füllsequenz (ebenfalls auf dieser Seite erwähnt) betrachten, können wir sehen, dass sie ziemlich zuverlässig ist, da unabhängig davon, wo der Befehlszeiger landet ( außer vielleicht dem zuletzt gefüllten Byte) kann die CPU die Ausführung eines gültigen Zwei-Byte- x86-Befehls fortsetzenCD CD
, in diesem Fall zum Erzeugen des Software-Interrupts 205 (0xCD).Noch seltsamer, während die Sequenz zu
CD CC CD CC
100% interpretierbar ist - entwederINT 3
oderINT 204
-,CC CD CC CD
ist die Sequenz weniger zuverlässig, nur 75% wie gezeigt, aber im Allgemeinen 99,99%, wenn sie als Speicherfüller mit int-Größe wiederholt wird.Macro Assembler Reference , 1987
quelle
NOP
? Würde die Eingabe eines einzelnen0xCC
Bytes mit demeb
Befehl (Bytes eingeben) nicht ausreichen?