Visual Studio C ++ ile bellek ayırma gösterimleri nelerdir?


216

Visual Studio, hepimiz "baadf00d" vardı, çalışma süresi boyunca C ++ hata ayıklayıcısında değişkenleri incelerken "CC" ve "CD" gördük.

Anladığım kadarıyla, "CC" DEBUG modundadır, sadece bir hafızanın yeni () ya da tahsis () olduğunu ve birimselleştirildiğini gösterir. "CD" silinmiş veya boş bellek temsil ederken. Ben sadece "baadf00d" RELEASE yapıda gördüm (ama yanlış olabilir).

Arada bir, bellek sızıntılarını, arabellek taşmalarını vb. Bir duruma sokuyoruz ve bu tür bilgiler işe yarıyor.

Birisi, hafızanın hata ayıklama amacıyla ne zaman ve hangi modlarda tanınabilir bayt kalıplarına ayarlandığını gösterecek kadar nazik olur mu?



@ Lưu Vĩnh Phúc: İşletim sistemi değil, hata ayıklayıcı. "D" (0xCD ve 0xDD'de olduğu gibi) Hata Ayıklama içindir (yani malloc_dbg, msdn.microsoft.com/en-us/library/aa270812(v=vs.60).aspx'de açıklandığı gibi malloc aracılığıyla çağrılan addır ). Ayrıca arabellek taşmaları izlemek için yığınların etrafında çit / mesaj eklediğine inanıyorum. Bir çift silme veya birden çok boş (veya silme [] yerine silme çağrısı bile mümkündür) ve atılan sarkan işaretçiler olduğunda ve verileri incelediğinizde, "0xDD" (veya başlatılmamış yığın 0xCD gösterdiğinde)
HidekiAI

İşletim sistemi olduğunu söylemedim.
Zerreyi

Yanıtlar:


317

Bu bağlantı daha fazla bilgi içeriyor:

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

* 0xABABABAB: Microsoft'un HeapAlloc () tarafından, ayrılmış bellekten sonra "No man's land" koruma baytlarını işaretlemek için kullanılır
* 0xABADCAFE: Hatalı işaretçileri yakalamak için tüm boş belleği başlatmak için bu değere yapılan bir başlangıç
* 0xBAADF00D: Microsoft'un LocalAlloc (LMEM_FIXED) tarafından başlatılmamış tahsis edilmiş yığın belleğini işaretlemek için kullanılır
* 0xBADCAB1E: Hata ayıklayıcıya bağlantı kesildiğinde Microsoft eVC hata ayıklayıcısına hata kodu döndürüldü
* 0xBEEFCACE: Microsoft .NET tarafından kaynak dosyalarında sihirli bir sayı olarak kullanılır
* 0xCCCCCCCC: Microsoft'un C ++ hata ayıklama çalışma zamanı kitaplığı tarafından başlatılmamış yığın belleğini işaretlemek için kullanılır
* 0xCDCDCDCD: Microsoft'un C ++ hata ayıklama çalışma zamanı kitaplığı tarafından başlatılmamış yığın belleğini işaretlemek için kullanılır
* 0xDDDDDDDD: Microsoft'un C ++ hata ayıklama yığını tarafından serbest yığın belleğini işaretlemek için kullanılır
* 0xDEADDEAD: Kullanıcı çökmeyi el ile başlattığında kullanılan bir Microsoft Windows DURDURMA Hata kodu.
* 0xFDFDFDFD: Microsoft'un C ++ hata ayıklama yığını tarafından ayrılmış yığın belleğinden önce ve sonra "hiçbir erkeğin ülkesi" koruma baytını işaretlemek için kullanılır
* 0xFEEEFEEE: Microsoft'un HeapFree () tarafından serbest bırakılmış yığın belleğini işaretlemek için kullanılır

20
Burada BAADF00D(kötü yemek), BEEFCACE(sığır pastası), BAADCAB1E(kötü kablo), BADCAFE(kötü kafe) ve DEADDEAD(ölü ölüler) görüyorum . Bu kasıtlı mı?
Anderson Green

38
@AndersonGreen Tabii ki kasıtlı. Buna hexspeak denir .

28
Günlerde bazı düşük seviyeli (işletim sistemi çekirdeği) programlama yaparken C0CAC01A kullanıyorduk ...;)
Per Lundberg

2
0xDEADBEEF, 0xC0EDBABEayrıca MS'in yerel diline düşmeseler bile klasikler
J. Paulding

3
Paul McCartney hayranı olarak, sevdimBEA71E5
BlueRaja - Danny Pflughoeft

111

Hata ayıklama ayırmalarına eklenmiş bazı yararlı bilgiler vardır. Bu tablo daha eksiksiz:

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

HeapAlloc Sonrası Adres () Malloc () Sonrası Ücretsiz Sırasında () HeapFree () Sonrası Yorumlar
0x00320FD8 -40 0x01090009 0x01090009 0x01090009 0x0109005A Win32 yığın bilgisi
0x00320FDC -36 0x01090009 0x00180700 0x01090009 0x00180400 Win32 yığın bilgisi
0x00320FE0 -32 0xBAADF00D 0x00320798 0xDDDDDDDD 0x00320448 Sonraki CRT yığın bloğuna Ptr (daha önce ayrılmış)
0x00320FE4 -28 0xBAADF00D 0x00000000 0xDDDDDDDD 0x00320448 Önceki CRT yığın bloğunu bırakma (daha sonra ayrılacak)
0x00320FE8-24 0xBAADF00D 0x00000000 0xDDDDDDDD 0xFEEEFEEE malloc () çağrısının dosya adı
0x00320FEC -20 0xBAADF00D 0x00000000 0xDDDDDDDD 0xFEEEFEEE malloc () çağrısının hat numarası
0x00320FF0 -16 0xBAADF00D 0x00000008 0xDDDDDDDD 0xFEEEFEEE Malloc () için bayt sayısı
0x00320FF4 -12 0xBAADF00D 0x00000001 0xDDDDDDDD 0xFEEEFEEE Türü (0 = Serbest, 1 = Normal, 2 = CRT kullanımı, vb.)
0x00320FF8 -8 0xBAADF00D 0x00000031 0xDDDDDDDD 0xFEEEFEEE İstek #, 0'dan artar
0x00320FFC -4 0xBAADF00D 0xFDFDFDFD 0xDDDDDDDD 0xFEEEFEEE Arazi yok
0x00321000 +0 0xBAADF00D 0xCDCDCDCD 0xDDDDDDDD 0xFEEEFEEE İstediğiniz 8 bayt
0x00321004 +4 0xBAADF00D 0xCDCDCDCD 0xDDDDDDDD 0xFEEEFEEE İstediğiniz 8 bayt
0x00321008 +8 0xBAADF00D 0xFDFDFDFD 0xDDDDDDDD 0xFEEEFEEE Arazi yok
0x0032100C +12 0xBAADF00D 0xBAADF00D 0xDDDDDDDD 0xFEEEFEEE Win32 yığın ayırmaları 16 bayta yuvarlanır
0x00321010 +16 0xABABABAB 0xABABABAB 0xABABABAB 0xFEEEFEEE Win32 yığın defter tutma
0x00321014 +20 0xABABABAB 0xABABABAB 0xABABABAB 0xFEEEFEEE Win32 yığın defter tutma
0x00321018 +24 0x00000010 0x00000010 0x00000010 0xFEEEFEEE Win32 yığın defter tutma
0x0032101C +28 0x00000000 0x00000000 0x00000000 0xFEEEFEEE Win32 yığın defter tutma
0x00321020 +32 0x00090051 0x00090051 0x00090051 0xFEEEFEEE Win32 yığın defter tutma
0x00321024 +36 0xFEEE0400 0xFEEE0400 0xFEEE0400 0xFEEEFEEE Win32 yığın defter tutma
0x00321028 +40 0x00320400 0x00320400 0x00320400 0xFEEEFEEE Win32 yığın defter tutma
0x0032102C +44 0x00320400 0x00320400 0x00320400 0xFEEEFEEE Win32 yığın defter tutma

5

İle ilgili olarak 0xCCve 0xCDözellikle, bunlardan kalıntıları olan Intel bir 8088 / 8086 1980'lerde işlemci komut seti arka. yazılım kesme opcode 0xCCözel bir durumudur . Özel tek baytlık sürüm , bir programın kesme 3 üretmesine izin verir .INT 0xCD0xCC

Yazılım kesme sayıları, prensip olarak, keyfi olarak, hata ayıklayıcı kesme veya kesme noktası işlevi INT 3için geleneksel olarak kullanılmasına rağmen , günümüze kadar devam eden bir kuraldır. Bir hata ayıklayıcı her başlatıldığında, bu opcode yürütüldüğünde hata ayıklayıcı tetiklenecek şekilde bir kesme işleyicisi yükler . Genellikle o anda çalışan programlamayı duraklatır ve etkileşimli bir istem gösterir.INT 3

Normalde, x86 INTopcode'u iki bayttır: 0xCDarkasından 0-255 arasında istenen kesme numarası gelir. Şimdi sorunu her ne kadar 0xCD 0x03için INT 3Intel version-- özel eklemeye karar, 0xCCbir işlem kodu kullanılmayan bellek için güvenilir bir 'dolgu byte' olarak işleve amacıyla tek bayt olmalıdır çünkü - hiçbir ek bayt ile.

Buradaki nokta , işlemci yanlışlıkla herhangi bir talimat içermeyen belleğe atlarsa, zarif bir kurtarma işlemi sağlamaktır . Çok baytlı talimatlar bu amaca uygun değildir, çünkü hatalı bir sıçrama, düzgün oluşturulmuş bir talimat akışıyla devam etmesi gereken herhangi bir olası bayt uzaklığına inebilir.

Açıkçası, bir baytlık opcodes bunun için önemsiz bir şekilde çalışır, ancak ilginç istisnalar da olabilir: örneğin, doldurma sekansı 0xCDCDCDCD(bu sayfada da belirtilmiştir) göz önüne alındığında , talimat işaretçisinin nereden geldiğine bakılmaksızın oldukça güvenilir olduğunu görebiliriz ( belki de son doldurulmuş bayt hariç ), CPU geçerli bir iki baytlık x86 komutu yürütmeye devam edebilir CD CD, bu durumda yazılım kesmesi 205 (0xCD) oluşturmak için.

Garip, yine de, CD CC CD CC% 100 yorumlanabilir - ya INT 3da ya - verilmesi , INT 204sekans CC CD CC CDdaha az güvenilirdir, gösterildiği gibi sadece% 75, ancak int boyutlu bir bellek dolgu maddesi olarak tekrarlandığında genellikle% 99.99'dur.

INT talimatını gösteren çağdaş 8088/8086 talimat seti kılavuzundan sayfa
Makro Birleştirici Referansı , 1987


Vay, 0xCC INT3 olduğunu (iki bağlamak) fark etmedi. Bu mantıklı (yani tesadüf değil). Ben birkaç kez (ne zaman geri) atlamadan önce kayıtları incelemek için JMP olan yerlerde "NOP + INT3" enjekte. Bu içgörü için teşekkürler, gizem çözüldü!
HidekiAI

Ne içindi NOP? (Enter bytes) komutuyla tek bir 0xCCbayt ebgirmek yeterli olmaz mı?
Glenn Slayden

Sadece bir alışkanlık, o zaman, bazı kodlar iki bayt okur ve atlama tablosu olarak kullanmaya çalışır veya bazı durumlarda montaj kodunu listelediğimde, NOP ekleyerek, '???' veya sökme işlemi sırasında (daha okunaklı) bir şey; Sonuç olarak, birçok nedenden dolayı, BRK'dan önce veya sonra sadece bir NOP enjekte etmek alışkanlık haline geldi; oh bazı durumlarda, bazı uygulamalar adres bloğunun sağlama toplamını yapmaya çalışır, bu yüzden INT3 + [bazı hex] sırıtış
HidekiAI
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.