Jakie są reprezentacje alokacji pamięci w Visual Studio C++?

W Visual Studio wszyscy mieliśmy "baadf00d", widzieliśmy " CC " i " CD " podczas sprawdzania zmiennych w debuggerze w C++ podczas uruchamiania.

Z tego, co rozumiem, "CC" jest w trybie debugowania tylko po to, aby wskazać, kiedy pamięć została nowa () lub alloc () i unitilializowana. Podczas gdy " CD " reprezentuje usuniętą lub wolną pamięć. Widziałem tylko "baadf00d" w RELEASE build (ale mogę się mylić).

Raz na jakiś czas mamy do czynienia z sytuacją, w której mamy do czynienia z wyciekami pamięci, przepełnieniem bufora itp i tego rodzaju informacje się przydają.

Czy ktoś mógłby wskazać kiedy i w jakich trybach pamięć jest ustawiona na rozpoznawalne wzorce bajtów w celu debugowania?

Author: HidekiAI, 2008-09-24

3 answers

Ten link ma więcej informacji:

Http://en.wikipedia.org/wiki/Magic_number_ (programowanie)

* 0xABABABAB : Used by Microsoft's HeapAlloc() to mark "no man's land" guard bytes after allocated heap memory
* 0xABADCAFE : A startup to this value to initialize all free memory to catch errant pointers
* 0xBAADF00D : Used by Microsoft's LocalAlloc(LMEM_FIXED) to mark uninitialised allocated heap memory
* 0xBADCAB1E : Error Code returned to the Microsoft eVC debugger when connection is severed to the debugger
* 0xBEEFCACE : Used by Microsoft .NET as a magic number in resource files
* 0xCCCCCCCC : Used by Microsoft's C++ debugging runtime library to mark uninitialised stack memory
* 0xCDCDCDCD : Used by Microsoft's C++ debugging runtime library to mark uninitialised heap memory
* 0xDDDDDDDD : Used by Microsoft's C++ debugging heap to mark freed heap memory
* 0xDEADDEAD : A Microsoft Windows STOP Error code used when the user manually initiates the crash.
* 0xFDFDFDFD : Used by Microsoft's C++ debugging heap to mark "no man's land" guard bytes before and after allocated heap memory
* 0xFEEEFEEE : Used by Microsoft's HeapFree() to mark freed heap memory
 270
Author: Mark Ingram,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-12 14:51:39

Jest naprawdę sporo przydatnych informacji dodanych do alokacji debugowania. Ta tabela jest bardziej kompletna:

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

Address  Offset After HeapAlloc() After malloc() During free() After HeapFree() Comments
0x00320FD8  -40    0x01090009    0x01090009     0x01090009    0x0109005A     Win32 heap info
0x00320FDC  -36    0x01090009    0x00180700     0x01090009    0x00180400     Win32 heap info
0x00320FE0  -32    0xBAADF00D    0x00320798     0xDDDDDDDD    0x00320448     Ptr to next CRT heap block (allocated earlier in time)
0x00320FE4  -28    0xBAADF00D    0x00000000     0xDDDDDDDD    0x00320448     Ptr to prev CRT heap block (allocated later in time)
0x00320FE8  -24    0xBAADF00D    0x00000000     0xDDDDDDDD    0xFEEEFEEE     Filename of malloc() call
0x00320FEC  -20    0xBAADF00D    0x00000000     0xDDDDDDDD    0xFEEEFEEE     Line number of malloc() call
0x00320FF0  -16    0xBAADF00D    0x00000008     0xDDDDDDDD    0xFEEEFEEE     Number of bytes to malloc()
0x00320FF4  -12    0xBAADF00D    0x00000001     0xDDDDDDDD    0xFEEEFEEE     Type (0=Freed, 1=Normal, 2=CRT use, etc)
0x00320FF8  -8     0xBAADF00D    0x00000031     0xDDDDDDDD    0xFEEEFEEE     Request #, increases from 0
0x00320FFC  -4     0xBAADF00D    0xFDFDFDFD     0xDDDDDDDD    0xFEEEFEEE     No mans land
0x00321000  +0     0xBAADF00D    0xCDCDCDCD     0xDDDDDDDD    0xFEEEFEEE     The 8 bytes you wanted
0x00321004  +4     0xBAADF00D    0xCDCDCDCD     0xDDDDDDDD    0xFEEEFEEE     The 8 bytes you wanted
0x00321008  +8     0xBAADF00D    0xFDFDFDFD     0xDDDDDDDD    0xFEEEFEEE     No mans land
0x0032100C  +12    0xBAADF00D    0xBAADF00D     0xDDDDDDDD    0xFEEEFEEE     Win32 heap allocations are rounded up to 16 bytes
0x00321010  +16    0xABABABAB    0xABABABAB     0xABABABAB    0xFEEEFEEE     Win32 heap bookkeeping
0x00321014  +20    0xABABABAB    0xABABABAB     0xABABABAB    0xFEEEFEEE     Win32 heap bookkeeping
0x00321018  +24    0x00000010    0x00000010     0x00000010    0xFEEEFEEE     Win32 heap bookkeeping
0x0032101C  +28    0x00000000    0x00000000     0x00000000    0xFEEEFEEE     Win32 heap bookkeeping
0x00321020  +32    0x00090051    0x00090051     0x00090051    0xFEEEFEEE     Win32 heap bookkeeping
0x00321024  +36    0xFEEE0400    0xFEEE0400     0xFEEE0400    0xFEEEFEEE     Win32 heap bookkeeping
0x00321028  +40    0x00320400    0x00320400     0x00320400    0xFEEEFEEE     Win32 heap bookkeeping
0x0032102C  +44    0x00320400    0x00320400     0x00320400    0xFEEEFEEE     Win32 heap bookkeeping
 106
Author: John Dibling,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-04 04:47:31

W odniesieniu do 0xCC i 0xCD w szczególności, są to relikty z Intel 8088/8086 zestaw instrukcji procesora z lat 80. XX wieku. {[0] } jest szczególnym przypadkiem programowego przerwania opcode INT 0xCD. Specjalna wersja jednobajtowa 0xCC pozwala programowi wygenerować przerwanie 3 .

Chociaż numery przerwań programowych są w zasadzie dowolne, INT 3 był tradycyjnie używany dla debugera funkcja break lub breakpoint, konwencja, która pozostaje do dziś. Gdy debugger jest uruchamiany, instaluje obsługę przerwań dla INT 3 tak, że po wykonaniu tego kodu zostanie uruchomiony debugger. Zazwyczaj zatrzyma aktualnie uruchomione programowanie i wyświetli interaktywny monit.

Normalnie, kod x86 INT to dwa bajty: 0xCD po którym następuje żądany numer przerwania od 0-255. Teraz chociaż możesz wydać 0xCD 0x03 za INT 3, Intel zdecydowałem się dodać specjalną wersję -- 0xCC bez dodatkowego bajtu -- ponieważ kod opcode musi mieć tylko jeden bajt, aby mógł funkcjonować jako niezawodny 'bajt wypełnienia' dla nieużywanej pamięci.

Chodzi o to, aby umożliwić płynne odzyskiwanie , Jeśli procesor omyłkowo przeskakuje 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ć w dowolnym możliwym offsecie bajtowym, gdzie musiałby kontynuować z prawidłowo uformowany strumień instrukcji.

Oczywiście, jednobajtowe kody OPC działają trywialnie, ale mogą być też dziwaczne wyjątki: na przykład, biorąc pod uwagę sekwencję wypełnienia 0xCDCDCDCD (wspomnianą również na tej stronie), widzimy, że jest ona dość wiarygodna, ponieważ bez względu na to, gdzie wyląduje wskaźnik {46]}instrukcji (z wyjątkiem być może {43]} ostatni wypełniony bajt), procesor może wznowić wykonywanie poprawnego dwubajtowego Instrukcja x86 CD CD, w tym przypadku do generowania oprogramowania interrupt 205 (0xcd)

Jest jeszcze dziwniejsza, podczas gdy CD CC CD CC jest w 100% interpretowalna -- dając INT 3 lub INT 204 -- Sekwencja CC CD CC CD jest mniej wiarygodna, tylko 75%, jak pokazano, ale ogólnie 99,99%, gdy powtarza się jako wypełniacz pamięci o rozmiarze int.

strona z 8088/8086 instruction set manual pokazująca instrukcję INT
Odniesienie Do Asemblera Makro, 1987

 3
Author: Glenn Slayden,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-04 13:49:56