विजुअल स्टूडियो सी ++ में, मेमोरी आवंटन प्रतिनिधित्व क्या हैं?


216

विजुअल स्टूडियो में, हमने "baadf00d" किया है, रन-टाइम के दौरान C ++ में डीबगर में चर का निरीक्षण करते समय "CC" और "CD" देखा है।

मैं जो समझता हूं, "CC" केवल डीबग मोड में है, यह इंगित करने के लिए कि कोई मेमोरी नई () या आवंटित () और यूनिटिविलाइज्ड है। जबकि "सीडी" डिलीट या मेमोरी को फ्री होल्ड करता है। मैंने केवल "baadf00d" को RELEASE बिल्ड में देखा है (लेकिन मैं गलत हो सकता हूं)।

एक बार थोड़ी देर में, हम मेमोरी लीक, बफर ओवरफ्लो आदि से निपटने की स्थिति में आ जाते हैं और इस तरह की जानकारी काम आती है।

क्या कोई ऐसा होगा जो यह इंगित करने के लिए पर्याप्त हो कि कब और किन मोड में मेमोरी डिबगिंग उद्देश्य के लिए पहचानने योग्य बाइट पैटर्न पर सेट की गई है?



@ Lưu V Lnh Phúc: यह OS नहीं है, यह डिबगर है। "D" (जैसा कि 0xCD और 0xDD पर है) डीबग (यानी malloc_dbg के लिए है जिसे msdn.microsoft.com/en-us/library/aa2708b((v=vs.60).aspx ) में बताया गया है । मेरा मानना ​​है कि यह बफर-ओवर्रन्स पर नज़र रखने के लिए ढेर के आसपास बाड़ / पोस्ट भी जोड़ता है। जब आप डबल-डिलीट या मल्टीपल-फ्री (या डिलीट ऑफ डिलीट [[]] और डैंगलिंग पॉइंटर्स जो बग का निपटारा कर चुके हैं और जब आप डेटा का निरीक्षण करते हैं, तो यह समस्या को पकड़ने के लिए काफी उपयोगी है। "0xDD" (या जब अनइंस्टॉल किए गए ढेर 0xCD दिखाता है)
HidekiAI

मैंने यह नहीं कहा कि यह ओएस है। यह दूसरा
प्रश्नकर्ता है जिसने

जवाबों:


317

इस लिंक में अधिक जानकारी है:

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

* .XABABABAB: Microsoft की HeapAlloc द्वारा उपयोग की गई ("नो मैन्स लैंड" गार्ड बाइट्स को चिह्नित करने के लिए आवंटित हीप मेमोरी के बाद
* * XABADCAFE: इस बिंदु पर एक स्टार्टअप गलत संकेत देने वालों को पकड़ने के लिए सभी मुफ्त मेमोरी को इनिशियलाइज़ करता है
* *XBAADF00D: Microsoft के LocalAlloc (LMEM_FIXED) द्वारा उपयोग किया जाता है, ताकि वे अनधिकृत रूप से आवंटित ढेर स्मृति को चिह्नित कर सकें
* IxBADCAB1E: त्रुटि कोड Microsoft eVC डीबगर पर लौटा जब कनेक्शन डीबगर से कनेक्ट किया जाता है
* .XBEEFCACE: Microsoft .NET द्वारा संसाधन फ़ाइलों में एक जादुई संख्या के रूप में उपयोग किया जाता है
* * XCCCCCCCC: Microsoft की C ++ डिबगिंग रनटाइम लाइब्रेरी द्वारा अनइंस्टॉल किए गए स्टैक मेमोरी को चिह्नित करने के लिए उपयोग किया जाता है
* * XCDCDCDCD: Microsoft की C ++ द्वारा रनिंग लाइब्रेरी का उपयोग अनइंस्टॉल किए गए हीप मेमोरी को चिह्नित करने के लिए किया जाता है
* * XDDDDDDDD: Microsoft की C ++ डिबगिंग हीप द्वारा फ्रीड हीप मेमोरी को चिह्नित करने के लिए उपयोग किया जाता है
* .XDEADDEAD: उपयोगकर्ता द्वारा मैन्युअल रूप से क्रैश करने पर Microsoft Windows STOP त्रुटि कोड का उपयोग किया जाता है।
* *XFDFDFDFD: Microsoft की C ++ डिबगिंग हीप द्वारा उपयोग किया जाता है ताकि पहले और बाद में आवंटित हीप मेमोरी में "नो मैन्स लैंड" गार्ड बाइट को चिह्नित कर सके।
* *XFEEEFEEEE: Microsoft की HeapFree () द्वारा प्रयुक्त फ्रीड हीप मेमोरी को चिह्नित करने के लिए

20
यहां, मैं BAADF00D(खराब भोजन), BEEFCACE(बीफ केक), BAADCAB1E(खराब केबल), BADCAFE(बुरा कैफे), और DEADDEAD(मृत मृत) देख रहा हूं । क्या यह जानबूझकर है?
एंडरसन ग्रीन

38
@AndersonGreen बेशक यह जानबूझकर है। इसे हेक्सस्पेक कहा जाता है ।

28
C0CAC01A का उपयोग हम तब करते थे जब हम कुछ निम्न-स्तरीय (ऑपरेटिंग सिस्टम कर्नेल) प्रोग्रामिंग को दिनों में वापस करते थे ...?)
प्रति लंडबर्ग

2
0xDEADBEEF, 0xC0EDBABEक्लासिक्स भी , भले ही वे एमएस के वर्नाक्यूलर में न पड़े हों
जे। पॉलिंग

3
एक पॉल मेकार्टनी प्रशंसक के रूप में, मैं शौकीन हूंBEA71E5
ब्लूराजा - डैनी पफ्लुगुफ्ट

111

वहाँ वास्तव में काफी उपयोगी जानकारी डिबग आवंटन में जोड़ा गया है। यह तालिका अधिक पूर्ण है:

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

HeapAlloc के बाद पता पता () मॉलॉक के बाद () के दौरान मुक्त () के बाद HeapFree () टिप्पणियाँ
0x00320FD8 -40 0x01090009 0x01090009 0x01090009 0x0109005A Win32 ढेर जानकारी
0x00320FDC -36 0x01090009 0x00180700 0x01090009 0x00180400 Win32 ढेर जानकारी
0x00320FE0 -32 0xBAADF00D 0x00320798 0xDDDDDDD 0x00320448 अगले CRT हीप ब्लॉक (समय से पहले आवंटित) को Ptr
0x00320FE4 -28 0xBAADF00D 0x00000000 0xDDDDDDD 0x00320448 CRT हीप ब्लॉक को प्रचलित करने के लिए Ptr (समय में बाद में आवंटित)
0x00320FE8 -24 0xBAADF00D 0x00000000 0xDDDDDDD 0xFEEEFEEE मॉलॉक का फ़ाइल नाम ()
0x00320FEC -20 0xBAADF00D 0x00000000 0xDDDDDDD 0xFEEEFEEE मॉलॉक की पंक्ति संख्या () कॉल
0x00320FF0 -16 0xBAADF00D 0x00000008 0xDDDDDDDD 0xFEEEFEEEE बाइट्स टू मॉलोक ()
0x00320FF4 -12 0xBAADF00D 0x00000001 0xDDDDDDD 0xFEEEFEEE प्रकार (0 = मुक्त, 1 = सामान्य, 2 = CRT उपयोग, आदि)
0x00320FF8 -8 0xBAADF00D 0x00000031 0xDDDDDDDD 0xFEEEFEEEE अनुरोध #, 0 से बढ़ता है
0x00320FFC -4 0xBAADF00D 0xFDFDDDFD 0xDDDDDDD 0xFEEEFEEE कोई आदमी भूमि नहीं
0x00321000 +0 0xBAADF00D 0xCDCDCDCD 0xDDDDDDDD 0xFEEEFEEE 8 बाइट्स जो आप चाहते थे
0x00321004 +4 0xBAADF00D 0xCDCDCDCD 0xDDDDDDDD 0xFEEEFEEE 8 बाइट्स जो आप चाहते थे
0x00321008 +8 0xBAADF00D 0xFDFDFDDDD 0xDDDDDDDD 0xFEEEFEEEE कोई आदमी भूमि नहीं
0x0032100C +12 0xBAADF00D 0xBAADF00D 0xDDDDDDDD 0xFEEEFEEE Win32 हीप आवंटन 16 बाइट तक राउंड किए जाते हैं
0x00321010 +16 0xABABABAB 0xABABABAB 0xABABABAB 0xFEEEFEEE Win32 ढेर बहीखाता
0x00321014 +20 0xABABABAB 0xABABABAB 0xABABABAB 0xFEEEFEEE Win32 हीप बहीखाता पद्धति
0x00321018 +25 0x00000010 0x00000010 0x00000010 0xFEEEFEEE Win32 ढेर बहीखाता पद्धति
0x0032101C_1 0x00000000 0x00000000 0x00000000 0xFEEEFEEE Win32 पुस्तक बुकिंग
0x00321020 +32 0x00090051 0x00090051 0x00090051 0xFEEEFEEE Win32 हीप बहीखाता पद्धति
0x00321024 +36 0xFEEE0400 0xFEEE0400 0xFEEE0400 0xFEEEFEEE Win32 ढेर बहीखाता
0x00321028 +40 0x00320400 0x00320400 0x00320400 0xFEEEFEEE Win32 ढेर बहीखाता
0x0032102C +44 0x00320400 0x00320400 0x00320400 0xFEEEFEEE Win32 ढेर बहीखाता पद्धति

5

के बारे में 0xCCऔर 0xCDविशेष रूप से, इन समय के अवशेष हैं इंटेल 8088 / 8086 1980 के दशक में प्रोसेसर अनुदेश सेट वापस। सॉफ्टवेयर इंटरप्ट ओपकोड 0xCCका एक विशेष मामला है । विशेष सिंगल-बाइट संस्करण एक कार्यक्रम को 3 बाधा उत्पन्न करने की अनुमति देता है ।INT 0xCD0xCC

हालाँकि, सॉफ़्टवेयर रुकावट संख्याएँ, सिद्धांत रूप में, मनमाने ढंग से, डिबगर ब्रेक या ब्रेकपॉइंट फ़ंक्शन के INT 3लिए पारंपरिक रूप से उपयोग की जाती थीं , जो एक कन्वेंशन है जो आज तक बनी हुई है। जब भी कोई डिबगर लॉन्च किया जाता है, तो वह इस तरह के लिए एक बाधा हैंडलर स्थापित करता है कि जब ओपकोड निष्पादित होता है तो डिबगर ट्रिगर हो जाएगा। आमतौर पर यह वर्तमान में चल रही प्रोग्रामिंग को रोक देगा और एक इंटरैक्टिव प्रॉम्प्ट दिखाएगा।INT 3

आम तौर पर, x86 INTओपकोड दो बाइट्स होता है: 0xCD0-255 से वांछित बाधा संख्या के बाद। अब हालांकि आप के 0xCD 0x03लिए जारी कर सकते हैं INT 3, इंटेल ने एक विशेष 0xCCसंस्करण को जोड़ने का फैसला किया - बिना किसी अतिरिक्त बाइट के साथ - क्योंकि अप्रयुक्त मेमोरी के लिए एक विश्वसनीय 'फिल बाइट' के रूप में कार्य करने के लिए एक ओपकोड केवल एक बाइट होना चाहिए।

यहाँ बिंदु को सुशोभित वसूली के लिए अनुमति देना है यदि प्रोसेसर गलती से स्मृति में कूदता है जिसमें कोई इच्छित निर्देश नहीं है । बहु-बाइट निर्देश इस उद्देश्य के अनुकूल नहीं हैं क्योंकि एक गलत छलांग किसी भी संभावित बाइट ऑफ़सेट पर उतर सकती है जहां इसे एक उचित रूप से गठित निर्देश धारा के साथ जारी रखना होगा।

जाहिर है, इसके लिए एक-बाइट opcodes तुच्छ रूप से काम करते हैं, लेकिन इसके अलावा विचित्र अपवाद भी हो सकते हैं: उदाहरण के लिए, भरण अनुक्रम 0xCDCDCDCD(इस पृष्ठ पर भी उल्लेख किया गया) पर विचार करते हुए , हम देख सकते हैं कि यह काफी विश्वसनीय है क्योंकि कोई फर्क नहीं पड़ता कि अनुदेश सूचक भूमि ( शायद अंतिम भरे बाइट को छोड़कर ), सीपीयू सॉफ्टवेयर बाधा 205 (0xCD) उत्पन्न करने के लिए इस मामले में एक मान्य दो-बाइट x86 निर्देश निष्पादित कर सकता है CD CD

Weirder अभी भी, जबकि CD CC CD CC100% व्याख्या करने योग्य है - INT 3या तो या INT 204- यह अनुक्रम CC CD CC CDकम विश्वसनीय है, केवल 75% दिखाया गया है, लेकिन आमतौर पर 99.99% जब एक अंतर-आकार मेमोरी भराव के रूप में दोहराया जाता है।

समसामयिक 8088/8086 अनुदेश सेट पेज मैनुअल INT अनुदेश दिखा रहा है
मैक्रो असेंबलर संदर्भ , 1987


वाह, मुझे एहसास नहीं था (दो कनेक्ट करें) 0xCC INT3 था। यह समझ में आता है (यानी संयोग से नहीं)। मैं "NOP + INT3" को उन जगहों पर इंजेक्ट करता था जहां कुछ अवसरों पर कूदने से पहले JMP के रजिस्टरों का निरीक्षण किया जाता है (जिस तरह से वापस आते हैं)। इस अंतर्दृष्टि के लिए धन्यवाद, रहस्य सुलझ गया!
हिदेकीएआई

किसलिए था NOP? एक एकल में प्रवेश नहीं होता 0xCCसाथ बाइट eb(प्रवेश बाइट्स) आदेश पर्याप्त?
ग्लेन स्लेडेन

बस एक आदत, वापस तो, कुछ कोड दो बाइट्स पढ़ेंगे और इसे जंप टेबल के रूप में उपयोग करने की कोशिश करेंगे, या कुछ मामलों में, जब मैं एनओपी जोड़कर असेंबली कोड को सूचीबद्ध करूंगा, तो यह '???' के रूप में नहीं दिखाई देगा? या कुछ (अधिक सुपाठ्य) जब जुदा हो; सभी में, कई कारणों से, यह सिर्फ BRK से पहले या बाद में एक NOP को इंजेक्ट करने की आदत बन गई; ओह, कुछ मामलों में, कुछ एप्लिकेशन पतों के ब्लॉक का चेकसम करने की कोशिश करेंगे, इसलिए मैं JMP $ XYZW को INT3 + [कुछ-हेक्स] मुस्कराहट के
HidekiAI
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.