W Visual Studio wszyscy mieliśmy „baadf00d”, widzieliśmy „CC” i „CD” podczas sprawdzania zmiennych w debuggerze w C ++ w czasie wykonywania.
Z tego, co rozumiem, „CC” jest w trybie DEBUGOWANIA tylko po to, aby wskazać, kiedy pamięć została nowa () lub przydzielona () i zunifikowana. Natomiast „CD” oznacza usuniętą lub zwolnioną pamięć. Widziałem tylko „baadf00d” w wersji RELEASE (ale mogę się mylić).
Od czasu do czasu dochodzimy do sytuacji, w której dochodzi do usuwania wycieków pamięci, przepełnienia bufora itp. I takie informacje są przydatne.
Czy ktoś byłby na tyle uprzejmy, aby wskazać, kiedy iw jakich trybach pamięć jest ustawiona na rozpoznawalne wzorce bajtów do celów debugowania?
debugging
visual-c++
HidekiAI
źródło
źródło
Odpowiedzi:
Ten link zawiera więcej informacji:
http://en.wikipedia.org/wiki/Magic_number_(programming)
źródło
BAADF00D
(złe jedzenie),BEEFCACE
(wołowe ciasto),BAADCAB1E
(zły kabel),BADCAFE
(zła kawiarnia) iDEADDEAD
(martwy trup). Czy to celowe?0xDEADBEEF
,0xC0EDBABE
także klasyki, nawet jeśli nie wpadły w język ojczysty MSBEA71E5
Do przydziałów debugowania dodano całkiem sporo przydatnych informacji. Ta tabela jest bardziej kompletna:
http://www.nobugs.org/developer/win32/debug_crt_heap.html#table
źródło
Odnośnie
0xCC
a0xCD
w szczególności są to relikty z Intel 8088 / 8086 zestawu instrukcji procesor z powrotem w 1980 roku.0xCC
Jest to specjalny przypadek oprogramowanie przerwania opcode . Specjalna wersja jednobajtowa pozwala programowi wygenerować przerwanie 3 .INT
0xCD
0xCC
Chociaż numery przerwań oprogramowania są w zasadzie arbitralne,
INT 3
tradycyjnie używano ich do funkcji debuggera lub funkcji punktu przerwania , która jest konwencją, która obowiązuje do dziś. Za każdym razem, gdy uruchamiany jest debugger, instaluje on moduł obsługi przerwańINT 3
, który uruchamia debugger po uruchomieniu tego kodu operacyjnego. Zazwyczaj wstrzymuje aktualnie uruchomione programowanie i wyświetla interaktywny monit.Zwykle
INT
kod operacji x86 ma dwa bajty:0xCD
po którym następuje pożądany numer przerwania od 0-255. Teraz chociaż można wydać0xCD 0x03
naINT 3
Intel postanowił dodać specjalną version--0xCC
bez dodatkowego bajtu - ponieważ kod operacji musi być tylko jeden bajt, aby funkcjonować jako wiarygodnego wypełnienia bajt „” dla nieużywanej pamięci.Chodzi o to, aby pozwolić na płynne odzyskiwanie, jeśli procesor omyłkowo wskoczy do pamięci, która nie zawiera żadnych zamierzonych instrukcji . Instrukcje wielobajtowe nie nadają się do tego celu, ponieważ błędny skok może wylądować przy dowolnym możliwym przesunięciu bajtu, gdzie musiałby kontynuować z prawidłowo utworzonym strumieniem instrukcji.
Oczywiście jednobajtowe kody operacyjne działają w tym przypadku w sposób trywialny, ale mogą istnieć również dziwaczne wyjątki: na przykład biorąc pod uwagę sekwencję wypełniania
0xCDCDCDCD
(również wspomnianą na tej stronie), widzimy, że jest dość niezawodny, ponieważ bez względu na to, gdzie wyląduje wskaźnik instrukcji ( z wyjątkiem być może ostatniego wypełnionego bajtu), procesor może wznowić wykonywanie ważnej dwubajtowej instrukcji x86CD CD
, w tym przypadku w celu wygenerowania przerwania programowego 205 (0xCD).Dziwniejsze nieruchomo, podczas gdy
CD CC CD CC
100% interpretacji - daje zarównoINT 3
lubINT 204
--the sekwencjaCC CD CC CD
jest mniej pewny, tylko 75%, jak pokazano, ale na ogół 99,99%, gdy powtarza się wypełniacz pamięci int wielkości.Macro Assembler Reference , 1987
źródło
NOP
? Czy wpisanie pojedynczego0xCC
bajtu za pomocą poleceniaeb
(enter bytes) nie wystarczy?