[Powered by Google Translate] [Valgrind] [Nate Hardison, হার্ভার্ড বিশ্ববিদ্যালয়] এটি CS50, CS50.TV] সি প্রোগ্রাম মধ্যে সবচেয়ে কঠিন কিছু বাগ মেমরি অব্যবস্থা থেকে আসে. একটি উপায় জিনিষ আপ ঘুর্ণি বিপুল নম্বর আছে, সহ মেমরির পরিমাণ ভুল বণ্টন, যাও ভেরিয়েবল আরম্ভ বিস্মরণ, আগে বা পরে একটি বাফার শেষ লেখা, এবং freeing মেমরি একাধিক বার রাখা. উপসর্গ সবিরাম বিপর্যয় থেকে শুরু যাও রহস্যজনকভাবে মান মুছে ফেলা, প্রায়ই এ জায়গা ও সময় মূল ত্রুটি থেকে দূরে সরানো. সন্ধান পর্যবেক্ষিত সমস্যা ফিরে অন্তর্নিহিত মূল কারণ যাও প্রতিদ্বন্দ্বিতা করা যায়, কিন্তু ভাগ্যক্রমে একটি সহায়ক প্রোগ্রাম নামক Valgrind আছে যে অনেক সাহায্য করতে পারেন. আপনি Valgrind অধীন সক্ষম একটি প্রোগ্রাম চালানো গাদা মেমরি বরাদ্দ এবং accesses ব্যাপক পরীক্ষা. যখন একটি সমস্যা সনাক্ত করা Valgrind, এটি আপনাকে অবিলম্বে আপনি, সরাসরি তথ্য সাহায্যে আপনি যাও আরো সহজে খুঁজে পেতে সমস্যা সমাধানের জন্য. Valgrind এছাড়াও কম মারাত্মক মেমরি সমস্যা রিপোর্ট, যেমন মেমরি তথ্য ফাঁসের, গাদা মেমরি বণ্টন, এবং এটি মুক্ত বিস্মরণ. আমাদের কম্পাইলার, আমাদের ডিবাগার মধ্যে ঝনঝন,, GDB যাচ্ছে, Valgrind মুক্ত সফটওয়্যার, এবং এটি প্রয়োগ ইনস্টল করা হয়. Valgrind আপনার বাইনারি এক্সিকিউটেবল উপর সঞ্চালিত হয়, . গ আপনার না বা. জ সোর্স কোড ফাইলগুলি, তাই নিশ্চিত করুন যে আপনি আপনার একটি প্রোগ্রাম আপ টু ডেট কপি কম্পাইল করা ঝনঝন শব্দ ব্যবহার করতে. তারপর, Valgrind অধীন আপনার প্রোগ্রাম হতে পারে মাত্র শব্দ Valgrind সাথে সাধারণ প্রোগ্রাম কমান্ড prefixing হিসাবে হিসাবে সহজ, যা আপ শুরু হয় এবং তা Valgrind ভিতরে প্রোগ্রাম চালায়. যখন শুরু, Valgrind আছে কিছু জটিল মেমরি চেক জন্য এক্সিকিউটেবল কনফিগার jiggering, তাই এটি পর্যন্ত পেতে একটু সময় লাগতে পারে. তারপর সাধারণত প্রোগ্রাম চালানো, এটি হবে আরো অনেক ধীরে ধীরে, এবং যখন তা সম্পন্ন না, Valgrind মুদ্রণ তার মেমরি ব্যবহারের একটি সংক্ষিপ্ত হবে. যদি সব ঠিক যায়, এটি ভালো হবে: এই ক্ষেত্রে,. / Clean_program একটি প্রোগ্রাম আমি চালাতে চান পাথ. এবং যখন এই এক কোনো আর্গুমেন্ট নিতে না, যদি তা আমি স্বাভাবিক হিসাবে কমান্ডের শেষে তাদের বন্ধনরজ্জু চাই. ক্লিন প্রোগ্রামটি শুধুমাত্র একটি মূর্খ আমি সামান্য প্রোগ্রাম তৈরি যে হিপ ints একটি ব্লক জন্য স্থান বরাদ্দ, কয়েকটি মানের তাদের অভ্যন্তরে রাখুন, এবং পুরো ব্লক মুক্ত করে. এটা কি আপনার জন্য কোন ত্রুটি এবং কোন তথ্য ফাঁসের শুটিং করছি. আরেকটি গুরুত্বপূর্ণ বৈশিষ্ট্যের মান সংগ্রহ করা হয় বরাদ্দ বাইট মোট সংখ্যা. তার ওপর নির্ভর করে প্রোগ্রাম, যদি আপনার বরাদ্দ মেগাবাইট বা উচ্চতর হয়, আপনি সম্ভবত করছি কিছু ভুল করছেন. হয় আপনি অকারণে সদৃশ সংরক্ষণকারী? আপনি কি সঞ্চয়ের জন্য গাদা ব্যবহার করে, যখন এটি যাও স্ট্যাক ব্যবহার করা ভাল হবে? সুতরাং, মেমরি ত্রুটি সত্যিই মন্দ হতে পারে. আরো বেশী প্রকাশ্য দর্শনীয় বিপর্যের কারণ, কিন্তু তারপর এটা এখনও হতে হার্ড যাও উৎস সন্ধান করতে পারেন ঠিক কি ক্র্যাশ করেছে. আরো insidiously, একটি মেমরি ত্রুটি সহ কোনো প্রোগ্রাম এখনও পরিপাটি করে কম্পাইল করতে পারেন এবং এখনও সঠিকভাবে কাজ করতে পারে বলে মনে হচ্ছে কারণ আপনি ভাগ্যবান সময় অধিকাংশ পেতে পরিচালিত. পরে বিভিন্ন "সফল ফলাফল," আপনি শুধু মনে হতে পারে যে একটি কম্পিউটার ক্র্যাশ একটি অপ্রত্যাশিত সাফল্য, কিন্তু কম্পিউটার ভুল হয় না. Valgrind চালনা আপনি দৃশ্যমান মেমরি সমস্যার কারণ ট্র্যাক নিচে সাহায্য করতে পারেন হিসাবে হিসাবে ভাল ত্রুটি গোপন আস্তানা খুঁজে আপনি জানেন না, এমনকি এখনো. প্রতিটি Valgrind সময় একটি সমস্যা সনাক্ত করা হলে, এটি কি এটা পর্যবেক্ষণ সম্পর্কে তথ্য ছাপে. প্রতিটি আইটেম মোটামুটি বাহুল্যবর্জিত - আপত্তিকর নির্দেশ উৎস লাইন, কি সমস্যা হয়, এবং একটি স্মৃতি জড়িত বিষয়ে সামান্য তথ্য - কিন্তু প্রায়ই এটা যথেষ্ট তথ্য অধিকার জায়গায় আপনার মনোযোগ নির্দেশ. এখানে Valgrind একটি উদাহরণ বগী একটি চলমান প্রোগ্রাম যে একটি গাদা মেমরি অবৈধ পঠিত আছে. আমরা কোন ত্রুটি কম্পাইলেশন অথবা সতর্কবার্তা দেখুন. Uh-উহু, ত্রুটি সংক্ষিপ্ত বলছেন যে দুটি ভুল থাকে - দুটি আকার 4 অবৈধ পাঠ্য - বাইট, যে হয়. উভয় খারাপ সার্চ invalid_read.c প্রধান ফাংশন ঘটেছে, লাইন 16 এবং লাইন 19 দ্বিতীয় প্রথম. যাক এর কোড তাকান. প্রথম কল যাও printf আমাদের মেমরি ব্লক শেষে গত এক int-এ পড়তে চেষ্টা মনে হচ্ছে. যদি আমরা Valgrind এর আউটপুট ফিরে তাকান, আমরা দেখতে যে Valgrind কথা ঠিক যে. ঠিকানা আমরা পড়ার চেষ্টা করছি 0 বাইট আরম্ভ গত মাপ 16 ২ বাইট ব্লক শেষে - চার 32 বিট ints যে আমরা বরাদ্দ. অর্থাৎ, ঠিকানা আমরা পড়ার চেষ্টা করার অধিকার আমাদের ছিল ব্লক শেষে শুরু হয়, ঠিক যেমন আমরা আমাদের খারাপ printf কলে দেখুন. এখন, অবৈধ পাঠ্য একটি চুক্তি যে বড় মনে নাও হতে পারে, কিন্তু যদি আপনি যে তথ্য আপনার প্রোগ্রামের প্রবাহ নিয়ন্ত্রণ ব্যবহার করছেন - উদাহরণস্বরূপ, একটি অংশ হিসাবে যদি বিবৃতি বা লুপ - তারপর চুপটি খারাপ জিনিষ যেতে পারেন. দেখুন কিভাবে আমি invalid_read প্রোগ্রাম রান করতে পারেন এবং সাধারণ কিছুই আউট ঘটবে. ভয়ের, তাই না? এখন, এর ধরনের উৎপন্ন ত্রুটি সম্পর্কে আরো কিছু ধরণের যে আপনি আপনার কোড সম্মুখীন হতে পারে তাকান, এবং আমরা কিভাবে Valgrind তাদের সনাক্ত করে দেখতে পাবেন. আমরা শুধু একটি invalid_read একটি উদাহরণ দেখেছি, তাই এখন আমি কি একটি invalid_write চেক আউট. আবার, কোন ত্রুটি কম্পাইলেশন অথবা সতর্কবাণী. ঠিক আছে, Valgrind বলছেন যে এই প্রোগ্রামে দুটি ভুল থাকে - এবং invalid_write এবং একটি invalid_read. চলুন এই কোড চেক আউট. দেখে মনে হচ্ছে আমরা ক্লাসিক strlen প্লাস একটি বাগ একটি দৃষ্টান্ত পেয়েছেন. কোড আছে malloc একটি স্থান অতিরিক্ত বাইট না জন্য / 0 চরিত্র, তাই যখন str কপি ssubstrlen তা লিখুন গিয়েছিলাম "cs50 স্কচ!" এটি আমাদের ব্লক শেষে গত 1 বাইট লিখেছে. invalid_read যখন আমরা printf আমাদের ফোন করতে. Printf সমাপ্ত অবৈধ মেমরি পড়া যখন এটি / 0 অক্ষর পাঠ্য হিসাবে এটা ই এই পংক্তির শেষে দেখায় এটা মুদ্রণ. কিন্তু এই কেউ Valgrind পলান. আমরা str কপি অংশ হিসাবে দেখতে যে এটা invalid_write ধরা প্রধান লাইন 11, এবং invalid_read হয় printf অংশ. উপর রক, Valgrind. আবার, এই একটি বড় চুক্তি মত মনে নাও হতে পারে. আমরা Valgrind বাইরে এই প্রোগ্রাম চালানো বহুবার পারেন এবং কোনো ত্রুটি লক্ষণ দেখতে পাচ্ছেন না. যাইহোক, এবার একটি এই গোলাপী প্রকরণ এ দেখতে এর চেহারা কিভাবে যে খুব খারাপ পেতে পারেন. সুতরাং, মঞ্জুর, আমরা জিনিস অপব্যবহারের ঠিক এই কোডের একটু বেশী হয়. আমরা কেবলমাত্র করছি হিপ দুটি পংক্তি জন্য স্থান বণ্টন cs50 পাথরের দৈর্ঘ্য, এই সময়, / 0 চরিত্র মনে. কিন্তু তারপর একটি অতি - দীর্ঘ স্ট্রিং আমরা মেমরি ব্লক সংযোজন করা যে, S যাও প্রতি নির্দেশ করা হয়. কি প্রভাব যে মেমরি ব্লক করা আছে যে দেয় T পয়েন্ট? ওয়েল, যদি মেমরি টি পয়েন্ট যে, S শুধু সন্নিহিত, এটা পরে আসছে, তারপর আমরা টি অংশ বেশী থাকতে পারে না চলুন এই কোড রান. কি ঘটেছে তাকান. স্ট্রিং আমরা আমাদের গাদা ব্লক উভয় সঞ্চিত আবির্ভাব মুদ্রিত সঠিকভাবে আউট. কিছুই মনে হয় এ সব ভুল. তবে, এর কোড আমাদের মধ্যে ফিরে যাওয়া এবং লাইন মন্তব্য আউট যেখানে আমরা cs50 স্কচ কপি দ্বিতীয় মেমরি ব্লক মধ্যে দ্বারা টন যাও, তীক্ষ্ন. এখন, যখন আমরা এই কোড রান আমরা should শুধুমাত্র দেখুন প্রথম মেমরি ব্লক বিষয়বস্তু আউট প্রিন্ট করা হবে. আরে, যদিও আমরা str কপি না দ্বিতীয় গাদা ব্লক মধ্যে যে কোন অক্ষর, এক দ্বারা T জোরাল, আমরা একটি মুদ্রণ পেতে আউট. প্রকৃতপক্ষে, স্ট্রিং আমরা আমাদের প্রথম ব্লক মধ্যে স্টাফ করা প্রথম ব্লক এবং ব্লকের মধ্যে দ্বিতীয় overran, ফলে সবকিছু স্বাভাবিক বলে মনে হচ্ছে. Valgrind, যদিও, আসল কথা বলে আমাদের. এখন পর্যন্ত আমরা যেতে. যারা অবৈধ সব সার্চ এবং লিখেছেন. চলুন ত্রুটির অন্য ধরনের একটি উদাহরণ তাকান. এখানে আমরা কিছু না বরং দু: খজনক. আমরা হিপ কোন int জন্য স্থান দখল, যে স্থান নির্দেশ করার জন্য - পি - এবং আমরা কোন int পয়েন্টার আরম্ভ. তবে, আমাদের পয়েন্টার সক্রিয়া করা হয়, তথ্য যে এটি মাত্র গাদা এর প্রতি নির্দেশ করে যে অংশ যাই হোক না কেন আবর্জনা করেনি হয়. সুতরাং যখন আমরা int তোমার মধ্যে যে তথ্য লোড, টেকনিক্যালি আমরা তোমার, আরম্ভ করা কিন্তু আমরা অপ্রয়োজনীয় তথ্য যাতে না. কল, জাহির যা একটি সহজ ডিবাগিং ম্যাক্রো যথাযোগ্যভাবে নামে গ্রন্থাগারের জাহির সংজ্ঞায়িত, প্রোগ্রাম যদি তার পরীক্ষা শর্ত বিফল পরিত্যাগ করবে না. মানে, যদি তোমার 0 হয় না. নাহলে স্ট্যাক স্পেস কি ছিল ভিত্তিতে পি যাও, সরু, এই প্রোগ্রাম এবং কখনও কখনও কাজ অন্যান্য সময়ে ব্যর্থ হতে পারে. যদি এটা কাজ করে, শুধু আমরা পেয়ে থাকেন ভাগ্যবান. কম্পাইলার এই ত্রুটি, পারিনি কিন্তু নিশ্চিত হবে Valgrind হবে. এখন পর্যন্ত আমরা ত্রুটি যা অপ্রয়োজনীয় তথ্য আমাদের ব্যবহার থেকে গৌন দেখুন. আপনি যখন গাদা মেমরি বরাদ্দ করা কিন্তু না অথবা এটি deallocate না এটি মুক্ত, যে একটি লিক বলা হয়. জন্য একটি ছোট, আকালিক প্রোগ্রাম চালানো এবং অবিলম্বে প্রস্থান করে, তথ্য ফাঁসের হয় মোটামুটি নিরীহ, কিন্তু জন্য বড় মাপে এবং / অথবা একটি প্রকল্প আয়ু, এমনকি সামান্য লিক কিছু প্রধান করে প্রাঙ্গন পারেন. CS50 জন্য, আমরা আপনাকে আশা না গাদা মেমরি বরাদ্দ করা যে আপনি সব freeing যত্ন, যেহেতু আমরা আপনার দক্ষতা সঠিকভাবে ম্যানুয়াল প্রক্রিয়া হ্যান্ডেল নির্মাণের চান সি দ্বারা প্রয়োজন এই কাজের জন্য আপনার একটি সঠিক প্রোগ্রাম থাকা উচিত এক এক malloc এবং বিনামূল্যে কল মধ্যে চিঠিপত্রের. সৌভাগ্যবসত, Valgrind মেমরি তথ্য ফাঁসের সঙ্গে খুব সাহায্য করতে পারেন. এখানে একটি ছিদ্রময় প্রোগ্রাম নামক leak.c যে বরাদ্দ হিপ বরাদ্দ স্থান অতিক্রম করে যাও, লিখেছেন, কিন্তু মুক্ত না. আমরা এবং তার Valgrind অধীন এটি চালানোর সঙ্গে এটা কম্পাইল, এবং আমরা দেখতে যে, যখন আমরা কোন মেমরি ত্রুটি আছে, আমরা এক লিক নেই. 16 বাইট স্পষ্টভাবে হারিয়ে আছে, যার মানে হল যে মেমরি পয়েন্টার সুযোগ সালে যখন প্রোগ্রাম থেকে প্রস্থান ছিল না. এখন, আমাদের Valgrind লিক সম্পর্কে অনেক তথ্য টন দেয় না, কিন্তু যদি আমরা এই সামান্য নোট অনুসরণ করে যে এটি রিপোর্টের নীচে প্রতি দেয় নিচে সঙ্গে পুন: প্রকাশ যাও - লিক চেক = পূর্ণ ফাঁস মেমরির সম্পূর্ণ বিবরণ দেখার জন্য, আমরা আরো তথ্য পাবেন. এখন, এ গাদা সারাংশ, Valgrind আমাদেরকে বলে প্রাথমিকভাবে যেখানে মেমরি যা হারিয়ে গেছে বরাদ্দ ছিল. শুধু হিসাবে আমরা সোর্স কোড মধ্যে খুঁজছেন থেকে জানি, Valgrind আমাদের জানায় যে আমরা মেমরি অবাঞ্ছিতভাবে malloc একটি রেখা 8 leak.c মধ্যে কলে বরাদ্দ প্রধান ফাংশন. চমত্কার কেতাদুরস্ত. Valgrind এই পদ ব্যবহার করে তথ্য ফাঁসের শ্রেণীবদ্ধ: নিশ্চিতভাবে হারিয়ে গেছে - এই গাদা বরাদ্দ মেমরির যাও কোন প্রোগ্রাম আর একটি ইশারা আছে. Valgrind জানেন যে আপনি একবার পয়েন্টার ছিল কিন্তু যেহেতু এটি ট্র্যাক হারিয়ে গেছে. এই মেমরি স্পষ্টভাবে অবাঞ্ছিতভাবে হয়. পরোক্ষভাবে হারিয়ে গেছে - এই গাদা বরাদ্দ মেমরির যার ফলে এটা শুধুমাত্র পয়েন্টার হারিয়ে যায়. উদাহরণস্বরূপ, যদি আপনি একটি লিঙ্ক তালিকার প্রথম নোডের আপনার পয়েন্টার হারিয়ে, তারপর স্পষ্টভাবে প্রথম নোডের নিজেই হারিয়ে যাবে, যখন পরোক্ষভাবে পরবর্তী কোনো নোড বিচ্ছিন্ন করা হবে. হয়ত হারিয়ে গেছে - এই গাদা বরাদ্দ মেমরির যা কিনা একটি Valgrind নিশ্চিত পয়েন্টার বা না হয় হতে পারে না. এখনও পৌঁছানো যাচ্ছে গাদা বরাদ্দ মেমরির যা এখনও প্রোগ্রাম থেকে প্রস্থান একটি ইশারা আছে, যা সাধারণত এর অর্থ হল যে একটি বিশ্বব্যাপী এটি পরিবর্তনশীল পয়েন্ট. এই তথ্য ফাঁসের জন্য পরীক্ষা করার জন্য, তবে আপনাকে বিকল্প অন্তর্ভুক্ত থাকবে - এখনও-পৌঁছানো = হ্যাঁ মধ্যে Valgrind আপনার আবাহন. এই বিভিন্ন ক্ষেত্রে তাদের পরিষ্কার আপ জন্য বিভিন্ন কৌশল প্রয়োজন হতে পারে, কিন্তু তথ্য ফাঁসের অপনীত করা উচিত. দুর্ভাগ্যবশত, তথ্য ফাঁসের স্থাপন হার্ড না হতে পারেন, থেকে বিনামূল্যে কল ভুল আপনার প্রোগ্রাম তিরস্কার করতে পারেন. উদাহরণস্বরূপ, যদি আমরা invalid_free.c তাকান, আমরা খারাপ মেমরি deallocation একটি উদাহরণ দেখুন. কি হতে একটি একক কল সমগ্র ব্লক মুক্ত উচিত দ্বারা int_block যাও মেমরি তীক্ষ্ন, করেনি পরিবর্তে হয়ে একটি প্রচেষ্টা প্রতিটি int-আকারের অধ্যায় মুক্ত এর পৃথকভাবে মেমরি. এই catastrophically ব্যর্থ হবে. পরিস্ফুটন! ত্রুটি কি একটি. এটি অবশ্যই ভাল না. যদি আপনি ভুল এই ধরনের সঙ্গে, যদিও, আটকে এবং আপনি যেখানে যাও চেহারা জানি না করছি, আপনার নতুন সেরা বন্ধু উপর ভরসা করা. আপনি এটা অনুমিত - Valgrind. , Valgrind হিসাবে সবসময়, জানেন ঠিক কি খবর. alloc এবং বিনামূল্যে সংখ্যা আপ না মেলে. আমরা 1 alloc এবং 4 মুক্ত পেয়েছেন. এবং এছাড়াও Valgrind বলে আমাদের যেখানে প্রথম খারাপ বিনামূল্যে কল - এক যে বিস্ফোরণ সূত্রপাত - থেকে আসছে - লাইন 16. হিসাবে আপনি দেখতে পাবেন, খারাপ কল মুক্ত হয় খুব খারাপ, যাতে আমরা আপনার প্রোগ্রাম লিক লেট প্রস্তাব যখন আপনি পেয়ে কার্যকারিতা সঠিক কাজ করছি. তথ্য ফাঁসের জন্য খুঁজছেন শুরু শুধুমাত্র পরে সঠিকভাবে আপনার প্রোগ্রাম কাজ করছে, ছাড়া অন্য কোনো ত্রুটি. এবং যে সমস্ত আমরা এই ভিডিওর জন্য পেয়েছেন. এখন কি আপনার জন্য অপেক্ষা করছি? আপনার প্রোগ্রামের উপর Valgrind অধিকার এখন রান এ যান. আমার নাম Nate Hardison. এটি CS50. [CS50.TV]