ভিজ্যুয়াল স্টুডিও সি ++ এ, মেমরি বরাদ্দের উপস্থাপনাগুলি কী কী?


216

ভিজ্যুয়াল স্টুডিওতে, আমরা সবাই "বাডফ০০ ডি" পেয়েছি, রান-টাইমের সময় সি ++ এ ডিবাগারে ভেরিয়েবলগুলি পরীক্ষা করার সময় "সিসি" এবং "সিডি" দেখেছি।

আমি যা বুঝতে পারি তা থেকে, "সিসি" কেবলমাত্র ডিবিবিজি মোডে থাকে যখন কোনও মেমরি নতুন () বা বরাদ্দ () এবং একত্রীকরণের হয়ে থাকে indicate যদিও "সিডি" মুছে ফেলা বা মুক্ত মেমরির প্রতিনিধিত্ব করে। আমি কেবল রিলেস বিল্ডে "baadf00d" দেখেছি (তবে আমি ভুল হতে পারি)।

কিছুক্ষণের মধ্যে, আমরা মেমরি ফাঁস, বাফার ওভারফ্লোগুলি ইত্যাদির মতো পরিস্থিতি নিয়ে যাই এবং এই জাতীয় তথ্য কার্যকর হয়।

কেউ কি কখন এবং কী মোডে ডিবাগিংয়ের উদ্দেশ্যে মেমরিটি সনাক্তকরণযোগ্য বাইট প্যাটার্নগুলিতে সেট করতে পারে তা উল্লেখ করার মতো যথেষ্ট দয়াবান হবে?



@ লু ভেন ফ্যাক: এটি ওএস নয়, এটি ডিবাগার। "ডি" (0xCD এবং 0xDD হিসাবে) (অর্থাত malloc_dbg কি যদি malloc মাধ্যমে বলা পরার হিসাবে ব্যাখ্যা করা ডিবাগ জন্য msdn.microsoft.com/en-us/library/aa270812(v=vs.60).aspx )। আমি বিশ্বাস করি যে এটি বাফার-ওভাররনগুলি ট্র্যাক করার জন্য স্তূপের চারপাশে বেড়া / পোস্ট যুক্ত করে। আপনি যখন ডাবল মুছা বা মাল্টিপল-ফ্রি (বা মুছে ফেলার পরিবর্তে মুছে ফেলার [] এমনকি কল) পয়েন্টারগুলি নিষ্পত্তি করা হয়েছে এবং যখন আপনি ডেটা পরিদর্শন করেন তখন সমস্যাগুলি ধরতে এটি বেশ কার্যকর it's "0xDD" (বা যখন অবিচ্ছিন্ন হিপগুলি 0xCD দেখায়)
হিদেকিএআই

আমি এটা ওএস না বলেছি না। এটি অন্য
প্রশ্নকারী যিনি শিরোনামটি

উত্তর:


317

এই লিঙ্কটিতে আরও তথ্য রয়েছে:

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

* 0 এক্সবাবাবাব: মাইক্রোসফ্টের হিপঅলোক () দ্বারা বরাদ্দকৃত হিপ মেমরির পরে "নো ম্যান ল্যান্ড" গার্ড বাইটস চিহ্নিত করতে ব্যবহৃত হয়
* 0 এক্সএবিডিএফএএফ: ভুল পয়েন্টার ধরার জন্য সমস্ত ফ্রি মেমরির আরম্ভ করার জন্য এই মানটির একটি সূচনা
* 0xBAADF00D: মাইক্রোসফ্টের লোকালএলক (LMEM_FIXED) দ্বারা অবিচ্ছিন্ন বরাদ্দ হওয়া হিপ মেমরি চিহ্নিত করতে ব্যবহৃত হয়
* 0xBADCAB1E: ডিবাগারে সংযোগ বিচ্ছিন্ন হয়ে যাওয়ার পরে ত্রুটি কোডটি মাইক্রোসফ্ট ইভিসি ডিবাগারে ফিরে আসে
* 0xBEEFCACE: মাইক্রোসফ্ট। নেট দ্বারা রিসোর্স ফাইলগুলিতে ম্যাজিক নম্বর হিসাবে ব্যবহৃত
* 0xCCCCCCCC: মাইক্রোসফ্টের সি ++ ডিবাগিং রানটাইম লাইব্রেরি দ্বারা অবিবেচনাযুক্ত স্ট্যাক মেমরি চিহ্নিত করতে ব্যবহৃত হয়
* 0xCDCDCDCD: মাইক্রোসফ্টের সি ++ ডিবাগিং রানটাইম লাইব্রেরি দ্বারা অবিবেচনাযুক্ত হিপ মেমরি চিহ্নিত করতে ব্যবহৃত হয়
* 0xDDDDDDDDD: মাইক্রোসফ্টের সি ++ ডিবাগিং হিপ দ্বারা মুক্ত হিপ মেমরি চিহ্নিত করতে ব্যবহৃত হয়
* 0xDEADDEAD: ব্যবহারকারী ম্যানুয়ালি ক্রাশ শুরু করার সময় একটি মাইক্রোসফ্ট উইন্ডোজ স্টপ ত্রুটি কোড ব্যবহৃত হয়।
* 0xFDFDFDFD: মাইক্রোসফ্টের সি ++ ডিবাগিং হ্যাপ ব্যবহার করে "নো ম্যান ল্যান্ড" রক্ষক বাইটগুলি বরাদ্দকৃত হিপ মেমরির আগে এবং পরে চিহ্নিত করতে ব্যবহৃত হয়
* 0xFEEEFEEE: মাইক্রোসফ্টের হিপফ্রি () দ্বারা মুক্ত হিপ মেমরি চিহ্নিত করতে ব্যবহৃত হয়

19
এখানে, আমি দেখছি BAADF00D(খারাপ খাবার), BEEFCACE(গরুর মাংসের কেক), BAADCAB1E(খারাপ কেবল), BADCAFE(খারাপ ক্যাফে) এবং DEADDEAD(মৃত মৃত)। এটা কি ইচ্ছাকৃত?
অ্যান্ডারসন সবুজ

38
@ অ্যান্ডারসগ্রিন অবশ্যই ইচ্ছাকৃত। একে হেক্সস্পিক বলা হয়

28
আমরা যখন দিনগুলিতে কিছু নিম্ন-স্তরের (অপারেটিং সিস্টেম কার্নেল) প্রোগ্রামিং করতাম তখন আমরা C0CAC01A ব্যবহার করতাম ...;)
প্রতি লন্ডবার্গ

2
0xDEADBEEF, 0xC0EDBABEএছাড়াও ক্লাসিক এমনকি যদি তারা মাইক্রোসফট এর স্বদেশীয় মধ্যে পড়ে না
জে Paulding,

3
পল ম্যাককার্টনির ভক্ত হিসাবে, আমি খুব পছন্দ করিBEA71E5
ব্লুরাজা - ড্যানি ফ্লুঘুফুট

111

ডিবাগ বরাদ্দের সাথে যুক্ত হয়েছে বেশ কিছু দরকারী তথ্য। এই টেবিলটি আরও সম্পূর্ণ:

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

হিপঅলোক () মেলোকের পরে () ফ্রি () হিপফ্রি () মন্তব্য পরে
0x00320FD8 -40 0x01090009 0x01090009 0x01090009 0x0109005A Win32 হিপ তথ্য
0x00320FDC -36 0x01090009 0x00180700 0x01090009 0x00180400 Win32 হিপ তথ্য
0x00320FE0 -32 0xBAADF00D 0x00320798 0xDDDDDDDDD 0x00320448 পিটিআর পরবর্তী সিআরটি হিপ ব্লকে (সময়ের আগে বরাদ্দ)
0x00320FE4 -28 0xBAADF00D 0x00000000 0xDDDDDDDDD 0x00320448 Ptr to prev CR CR হিপ ব্লক (পরে বরাদ্দ)
0x00320FE8 -24 0xBAADF00D 0x0000000000xxDDDDDDDDD 0xFEEEFEEE ম্যালোক () কলের ফাইলের নাম
0x00320FEC -20 0xBAADF00D 0x00000000 0xDDDDDDDDD 0xFEEEFEEE লাইনের নম্বর ম্যালোক () কল
0x00320FF0 -16 0xBAADF00D 0x00000008 0xDDDDDDDDD 0xFEEEFEEE ম্যালোকের বাইট সংখ্যা ()
0x00320FF4 -12 0xBAADF00D 0x00000001 0xDDDDDDDDD 0xFEEEFEE প্রকার (0 = মুক্ত, 1 = সাধারণ, 2 = সিআরটি ব্যবহার ইত্যাদি)
0x00320FF8 -8 0xBAADF00D 0x00000031 0xDDDDDDDDD 0xFEEEFEEE অনুরোধ #, 0 থেকে বৃদ্ধি পায়
0x00320FFC -4 0xBAADF00D 0xFDFDFDFD 0xDDDDDDDDD 0xFEEEFEEE ম্যানস ল্যান্ড নেই
0x00321000 +0 0xBAADF00D 0xCDCDCDCD 0xDDDDDDDDD 0xFEEEFEEE আপনি যে 8 বাইট চেয়েছিলেন
0x00321004 +4 0xBAADF00D 0xCDCDCDCD 0xDDDDDDDDD 0xFEEEFEEE আপনি যে 8 বাইট চেয়েছিলেন
0x00321008 +8 0xBAADF00D 0xFDFDFDFD 0xDDDDDDDDD 0xFEEEFEEE কোনও ম্যান জমি
0x0032100C +12 0xBAADF00D 0xBAADF00D 0xDDDDDDDDD 0xFEEEFEEE Win32 হ্যাপ বরাদ্দ 16 বাইট অবধি
0x00321010 +16 0xABABABAB 0xABABABAB 0xABABABAB 0xFEEEFEEE Win32 হিপ বুককিপিং
0x00321014 +20 0xABABABAB 0xABABABAB 0xABABABAB 0xFEEEFEEE Win32 হিপ বুককিপিং
0x00321018 +24 0x00000010 0x00000010 0x00000010 0xFEEEFEEE Win32 হিপ বুককিপিং
0x0032101C +28 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ইনটেল, version-- একটি বিশেষ যোগ করার সিদ্ধান্ত নিয়েছে 0xCCকোন অতিরিক্ত বাইট দিয়ে - কারণ একটি opcode অব্যবহৃত মেমরির জন্য একটি নির্ভরযোগ্য 'ভরাট বাইট' হিসেবে ফাংশনে অনুক্রমে শুধুমাত্র এক বাইট হতে হবে।

এখানে বিন্দু সুতনু পুনরুদ্ধারের জন্য অনুমতি দেওয়া যদি প্রসেসর ভুল মেমরির যে কোনো উদ্দেশ্যে নির্দেশাবলী ধারণ করে না বা জাম্প । মাল্টি-বাইট নির্দেশাবলী এই উদ্দেশ্যটির পক্ষে উপযুক্ত নয় কারণ একটি ভুল লাফানো যে কোনও সম্ভাব্য বাইট অফসেটে অবতরণ করতে পারে যেখানে এটি সঠিকভাবে গঠিত নির্দেশের প্রবাহের সাথে চালিয়ে যেতে হবে।

স্পষ্টতই, এই জন্য ওয়ান-বাইট অপকডগুলি তুচ্ছভাবে কাজ করে, তবে এর মধ্যে স্পর্শকাতর ব্যতিক্রমগুলিও থাকতে পারে: উদাহরণস্বরূপ, ফিল সিকোয়েন্সটি বিবেচনা করে 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। এটি উপলব্ধি করে (অর্থাত্ কাকতালীয়ভাবে নয়)। আমি জেএমপি'র যে জায়গাগুলিতে নিখরচাগুলি পরীক্ষা করার জন্য সেখানে কয়েকটি অনুষ্ঠানে ঝাঁপিয়ে পড়েছিল তার আগে "এনওপি + আইএনটি 3" ইনজেকশন করতাম ( এই অন্তর্দৃষ্টি জন্য ধন্যবাদ, রহস্য সমাধান!
হিদেকিএইআই

কি জন্য ছিল NOP? (বাইটস প্রবেশ করান) কমান্ডটি 0xCCদিয়ে কি একটি একক বাইট প্রবেশ করবে না eb?
গ্লেন স্লেডেন

কেবল একটি অভ্যাস, তারপরে, কিছু কোড দুটি বাইট পড়ত এবং এটিকে জাম্প টেবিল হিসাবে ব্যবহার করার চেষ্টা করত, বা কোনও কোনও ক্ষেত্রে আমি যখন অ্যাসেম্বলি কোডটি তালিকাবদ্ধ করি, এনওপি যুক্ত করে, এটি '???' হিসাবে দেখায় না বা বিচ্ছিন্ন করার সময় কিছু (আরও সুস্পষ্ট); সব মিলিয়ে একাধিক কারণে কেবল বিআরকে-র আগে বা পরে কোনও এনওপি ইনজেকশন করা অভ্যাসে পরিণত হয়েছিল; উহু কিছু ক্ষেত্রে, কিছু অ্যাপ্লিকেশান ঠিকানাগুলির ব্লক চেকসাম করতে, তাই আমি সঙ্গে INT3 [কিছু-হেক্স] JMP $ XYZW আউট সামঞ্জস্য বজায় রাখা চাই চেষ্টা করবে নীরবে
HidekiAI
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.