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?
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
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
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.
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