1 00:00:00,000 --> 00:00:02,000 [Powered by Google Translate] [Valgrind] 2 00:00:02,000 --> 00:00:05,000 [Nate Hardison, হার্ভার্ড বিশ্ববিদ্যালয়] 3 00:00:05,000 --> 00:00:07,000 এটি CS50, CS50.TV] 4 00:00:07,000 --> 00:00:10,000 সি প্রোগ্রাম মধ্যে সবচেয়ে কঠিন কিছু বাগ 5 00:00:10,000 --> 00:00:13,000 মেমরি অব্যবস্থা থেকে আসে. 6 00:00:13,000 --> 00:00:15,000 একটি উপায় জিনিষ আপ ঘুর্ণি বিপুল নম্বর আছে, 7 00:00:15,000 --> 00:00:17,000 সহ মেমরির পরিমাণ ভুল বণ্টন, 8 00:00:17,000 --> 00:00:20,000 যাও ভেরিয়েবল আরম্ভ বিস্মরণ, 9 00:00:20,000 --> 00:00:23,000 আগে বা পরে একটি বাফার শেষ লেখা, 10 00:00:23,000 --> 00:00:25,000 এবং freeing মেমরি একাধিক বার রাখা. 11 00:00:25,000 --> 00:00:28,000 উপসর্গ সবিরাম বিপর্যয় থেকে শুরু 12 00:00:28,000 --> 00:00:30,000 যাও রহস্যজনকভাবে মান মুছে ফেলা, 13 00:00:30,000 --> 00:00:34,000 প্রায়ই এ জায়গা ও সময় মূল ত্রুটি থেকে দূরে সরানো. 14 00:00:34,000 --> 00:00:37,000 সন্ধান পর্যবেক্ষিত সমস্যা ফিরে অন্তর্নিহিত মূল কারণ যাও 15 00:00:37,000 --> 00:00:39,000 প্রতিদ্বন্দ্বিতা করা যায়, 16 00:00:39,000 --> 00:00:42,000 কিন্তু ভাগ্যক্রমে একটি সহায়ক প্রোগ্রাম নামক Valgrind আছে 17 00:00:42,000 --> 00:00:44,000 যে অনেক সাহায্য করতে পারেন. 18 00:00:44,000 --> 00:00:47,000 >> আপনি Valgrind অধীন সক্ষম একটি প্রোগ্রাম চালানো 19 00:00:47,000 --> 00:00:50,000 গাদা মেমরি বরাদ্দ এবং accesses ব্যাপক পরীক্ষা. 20 00:00:50,000 --> 00:00:53,000 যখন একটি সমস্যা সনাক্ত করা Valgrind, এটি আপনাকে অবিলম্বে আপনি, 21 00:00:53,000 --> 00:00:56,000 সরাসরি তথ্য সাহায্যে আপনি যাও 22 00:00:56,000 --> 00:00:58,000 আরো সহজে খুঁজে পেতে সমস্যা সমাধানের জন্য. 23 00:00:58,000 --> 00:01:01,000 Valgrind এছাড়াও কম মারাত্মক মেমরি সমস্যা রিপোর্ট, 24 00:01:01,000 --> 00:01:04,000 যেমন মেমরি তথ্য ফাঁসের, গাদা মেমরি বণ্টন, 25 00:01:04,000 --> 00:01:07,000 এবং এটি মুক্ত বিস্মরণ. 26 00:01:07,000 --> 00:01:10,000 আমাদের কম্পাইলার, আমাদের ডিবাগার মধ্যে ঝনঝন,, GDB যাচ্ছে, 27 00:01:10,000 --> 00:01:14,000 Valgrind মুক্ত সফটওয়্যার, এবং এটি প্রয়োগ ইনস্টল করা হয়. 28 00:01:14,000 --> 00:01:16,000 Valgrind আপনার বাইনারি এক্সিকিউটেবল উপর সঞ্চালিত হয়, 29 00:01:16,000 --> 00:01:20,000 . গ আপনার না বা. জ সোর্স কোড ফাইলগুলি, 30 00:01:20,000 --> 00:01:23,000 তাই নিশ্চিত করুন যে আপনি আপনার একটি প্রোগ্রাম আপ টু ডেট কপি কম্পাইল করা 31 00:01:23,000 --> 00:01:25,000 ঝনঝন শব্দ ব্যবহার করতে. 32 00:01:25,000 --> 00:01:28,000 তারপর, Valgrind অধীন আপনার প্রোগ্রাম হতে পারে 33 00:01:28,000 --> 00:01:32,000 মাত্র শব্দ Valgrind সাথে সাধারণ প্রোগ্রাম কমান্ড prefixing হিসাবে হিসাবে সহজ, 34 00:01:32,000 --> 00:01:35,000 যা আপ শুরু হয় এবং তা Valgrind ভিতরে প্রোগ্রাম চালায়. 35 00:01:35,000 --> 00:01:38,000 যখন শুরু, Valgrind আছে কিছু জটিল 36 00:01:38,000 --> 00:01:41,000 মেমরি চেক জন্য এক্সিকিউটেবল কনফিগার jiggering, 37 00:01:41,000 --> 00:01:44,000 তাই এটি পর্যন্ত পেতে একটু সময় লাগতে পারে. 38 00:01:44,000 --> 00:01:48,000 তারপর সাধারণত প্রোগ্রাম চালানো, এটি হবে আরো অনেক ধীরে ধীরে, 39 00:01:48,000 --> 00:01:52,000 এবং যখন তা সম্পন্ন না, Valgrind মুদ্রণ তার মেমরি ব্যবহারের একটি সংক্ষিপ্ত হবে. 40 00:01:52,000 --> 00:01:58,000 যদি সব ঠিক যায়, এটি ভালো হবে: 41 00:01:58,000 --> 00:02:01,000 এই ক্ষেত্রে,. / Clean_program 42 00:02:01,000 --> 00:02:04,000 একটি প্রোগ্রাম আমি চালাতে চান পাথ. 43 00:02:04,000 --> 00:02:06,000 এবং যখন এই এক কোনো আর্গুমেন্ট নিতে না, 44 00:02:06,000 --> 00:02:09,000 যদি তা আমি স্বাভাবিক হিসাবে কমান্ডের শেষে তাদের বন্ধনরজ্জু চাই. 45 00:02:09,000 --> 00:02:12,000 ক্লিন প্রোগ্রামটি শুধুমাত্র একটি মূর্খ আমি সামান্য প্রোগ্রাম তৈরি 46 00:02:12,000 --> 00:02:15,000 যে হিপ ints একটি ব্লক জন্য স্থান বরাদ্দ, 47 00:02:15,000 --> 00:02:19,000 কয়েকটি মানের তাদের অভ্যন্তরে রাখুন, এবং পুরো ব্লক মুক্ত করে. 48 00:02:19,000 --> 00:02:23,000 এটা কি আপনার জন্য কোন ত্রুটি এবং কোন তথ্য ফাঁসের শুটিং করছি. 49 00:02:23,000 --> 00:02:27,000 >> আরেকটি গুরুত্বপূর্ণ বৈশিষ্ট্যের মান সংগ্রহ করা হয় বরাদ্দ বাইট মোট সংখ্যা. 50 00:02:27,000 --> 00:02:32,000 তার ওপর নির্ভর করে প্রোগ্রাম, যদি আপনার বরাদ্দ মেগাবাইট বা উচ্চতর হয়, 51 00:02:32,000 --> 00:02:34,000 আপনি সম্ভবত করছি কিছু ভুল করছেন. 52 00:02:34,000 --> 00:02:37,000 হয় আপনি অকারণে সদৃশ সংরক্ষণকারী? 53 00:02:37,000 --> 00:02:40,000 আপনি কি সঞ্চয়ের জন্য গাদা ব্যবহার করে, যখন এটি যাও স্ট্যাক ব্যবহার করা ভাল হবে? 54 00:02:40,000 --> 00:02:43,000 সুতরাং, মেমরি ত্রুটি সত্যিই মন্দ হতে পারে. 55 00:02:43,000 --> 00:02:46,000 আরো বেশী প্রকাশ্য দর্শনীয় বিপর্যের কারণ, 56 00:02:46,000 --> 00:02:49,000 কিন্তু তারপর এটা এখনও হতে হার্ড যাও উৎস সন্ধান করতে পারেন 57 00:02:49,000 --> 00:02:51,000 ঠিক কি ক্র্যাশ করেছে. 58 00:02:51,000 --> 00:02:54,000 আরো insidiously, একটি মেমরি ত্রুটি সহ কোনো প্রোগ্রাম 59 00:02:54,000 --> 00:02:56,000 এখনও পরিপাটি করে কম্পাইল করতে পারেন 60 00:02:56,000 --> 00:02:58,000 এবং এখনও সঠিকভাবে কাজ করতে পারে বলে মনে হচ্ছে 61 00:02:58,000 --> 00:03:01,000 কারণ আপনি ভাগ্যবান সময় অধিকাংশ পেতে পরিচালিত. 62 00:03:01,000 --> 00:03:04,000 পরে বিভিন্ন "সফল ফলাফল," 63 00:03:04,000 --> 00:03:07,000 আপনি শুধু মনে হতে পারে যে একটি কম্পিউটার ক্র্যাশ একটি অপ্রত্যাশিত সাফল্য, 64 00:03:07,000 --> 00:03:10,000 কিন্তু কম্পিউটার ভুল হয় না. 65 00:03:10,000 --> 00:03:13,000 >> Valgrind চালনা আপনি দৃশ্যমান মেমরি সমস্যার কারণ ট্র্যাক নিচে সাহায্য করতে পারেন 66 00:03:13,000 --> 00:03:18,000 হিসাবে হিসাবে ভাল ত্রুটি গোপন আস্তানা খুঁজে আপনি জানেন না, এমনকি এখনো. 67 00:03:18,000 --> 00:03:22,000 প্রতিটি Valgrind সময় একটি সমস্যা সনাক্ত করা হলে, এটি কি এটা পর্যবেক্ষণ সম্পর্কে তথ্য ছাপে. 68 00:03:22,000 --> 00:03:24,000 প্রতিটি আইটেম মোটামুটি বাহুল্যবর্জিত - 69 00:03:24,000 --> 00:03:27,000 আপত্তিকর নির্দেশ উৎস লাইন, কি সমস্যা হয়, 70 00:03:27,000 --> 00:03:30,000 এবং একটি স্মৃতি জড়িত বিষয়ে সামান্য তথ্য - 71 00:03:30,000 --> 00:03:34,000 কিন্তু প্রায়ই এটা যথেষ্ট তথ্য অধিকার জায়গায় আপনার মনোযোগ নির্দেশ. 72 00:03:34,000 --> 00:03:37,000 এখানে Valgrind একটি উদাহরণ বগী একটি চলমান প্রোগ্রাম 73 00:03:37,000 --> 00:03:40,000 যে একটি গাদা মেমরি অবৈধ পঠিত আছে. 74 00:03:40,000 --> 00:03:49,000 আমরা কোন ত্রুটি কম্পাইলেশন অথবা সতর্কবার্তা দেখুন. 75 00:03:49,000 --> 00:03:53,000 Uh-উহু, ত্রুটি সংক্ষিপ্ত বলছেন যে দুটি ভুল থাকে - 76 00:03:53,000 --> 00:03:56,000 দুটি আকার 4 অবৈধ পাঠ্য - বাইট, যে হয়. 77 00:03:56,000 --> 00:04:01,000 উভয় খারাপ সার্চ invalid_read.c প্রধান ফাংশন ঘটেছে, 78 00:04:01,000 --> 00:04:04,000 লাইন 16 এবং লাইন 19 দ্বিতীয় প্রথম. 79 00:04:04,000 --> 00:04:06,000 যাক এর কোড তাকান. 80 00:04:06,000 --> 00:04:11,000 প্রথম কল যাও printf আমাদের মেমরি ব্লক শেষে গত এক int-এ পড়তে চেষ্টা মনে হচ্ছে. 81 00:04:11,000 --> 00:04:13,000 যদি আমরা Valgrind এর আউটপুট ফিরে তাকান, 82 00:04:13,000 --> 00:04:16,000 আমরা দেখতে যে Valgrind কথা ঠিক যে. 83 00:04:16,000 --> 00:04:19,000 ঠিকানা আমরা পড়ার চেষ্টা করছি 0 বাইট আরম্ভ 84 00:04:19,000 --> 00:04:22,000 গত মাপ 16 ২ বাইট ব্লক শেষে - 85 00:04:22,000 --> 00:04:25,000 চার 32 বিট ints যে আমরা বরাদ্দ. 86 00:04:25,000 --> 00:04:29,000 অর্থাৎ, ঠিকানা আমরা পড়ার চেষ্টা করার অধিকার আমাদের ছিল ব্লক শেষে শুরু হয়, 87 00:04:29,000 --> 00:04:32,000 ঠিক যেমন আমরা আমাদের খারাপ printf কলে দেখুন. 88 00:04:32,000 --> 00:04:36,000 এখন, অবৈধ পাঠ্য একটি চুক্তি যে বড় মনে নাও হতে পারে, 89 00:04:36,000 --> 00:04:39,000 কিন্তু যদি আপনি যে তথ্য আপনার প্রোগ্রামের প্রবাহ নিয়ন্ত্রণ ব্যবহার করছেন - 90 00:04:39,000 --> 00:04:42,000 উদাহরণস্বরূপ, একটি অংশ হিসাবে যদি বিবৃতি বা লুপ - 91 00:04:42,000 --> 00:04:45,000 তারপর চুপটি খারাপ জিনিষ যেতে পারেন. 92 00:04:45,000 --> 00:04:47,000 দেখুন কিভাবে আমি invalid_read প্রোগ্রাম রান করতে পারেন 93 00:04:47,000 --> 00:04:50,000 এবং সাধারণ কিছুই আউট ঘটবে. 94 00:04:50,000 --> 00:04:52,000 ভয়ের, তাই না? 95 00:04:52,000 --> 00:04:56,000 >> এখন, এর ধরনের উৎপন্ন ত্রুটি সম্পর্কে আরো কিছু ধরণের যে আপনি আপনার কোড সম্মুখীন হতে পারে তাকান, 96 00:04:56,000 --> 00:04:59,000 এবং আমরা কিভাবে Valgrind তাদের সনাক্ত করে দেখতে পাবেন. 97 00:04:59,000 --> 00:05:01,000 আমরা শুধু একটি invalid_read একটি উদাহরণ দেখেছি, 98 00:05:01,000 --> 00:05:04,000 তাই এখন আমি কি একটি invalid_write চেক আউট. 99 00:05:04,000 --> 00:05:09,000 আবার, কোন ত্রুটি কম্পাইলেশন অথবা সতর্কবাণী. 100 00:05:09,000 --> 00:05:12,000 ঠিক আছে, Valgrind বলছেন যে এই প্রোগ্রামে দুটি ভুল থাকে - 101 00:05:12,000 --> 00:05:15,000 এবং invalid_write এবং একটি invalid_read. 102 00:05:15,000 --> 00:05:18,000 চলুন এই কোড চেক আউট. 103 00:05:18,000 --> 00:05:21,000 দেখে মনে হচ্ছে আমরা ক্লাসিক strlen প্লাস একটি বাগ একটি দৃষ্টান্ত পেয়েছেন. 104 00:05:21,000 --> 00:05:24,000 কোড আছে malloc একটি স্থান অতিরিক্ত বাইট না 105 00:05:24,000 --> 00:05:26,000 জন্য / 0 চরিত্র, 106 00:05:26,000 --> 00:05:30,000 তাই যখন str কপি ssubstrlen তা লিখুন গিয়েছিলাম "cs50 স্কচ!" 107 00:05:30,000 --> 00:05:33,000 এটি আমাদের ব্লক শেষে গত 1 বাইট লিখেছে. 108 00:05:33,000 --> 00:05:36,000 invalid_read যখন আমরা printf আমাদের ফোন করতে. 109 00:05:36,000 --> 00:05:40,000 Printf সমাপ্ত অবৈধ মেমরি পড়া যখন এটি / 0 অক্ষর পাঠ্য 110 00:05:40,000 --> 00:05:43,000 হিসাবে এটা ই এই পংক্তির শেষে দেখায় এটা মুদ্রণ. 111 00:05:43,000 --> 00:05:45,000 কিন্তু এই কেউ Valgrind পলান. 112 00:05:45,000 --> 00:05:48,000 আমরা str কপি অংশ হিসাবে দেখতে যে এটা invalid_write ধরা 113 00:05:48,000 --> 00:05:51,000 প্রধান লাইন 11, এবং invalid_read হয় printf অংশ. 114 00:05:51,000 --> 00:05:54,000 উপর রক, Valgrind. 115 00:05:54,000 --> 00:05:57,000 আবার, এই একটি বড় চুক্তি মত মনে নাও হতে পারে. 116 00:05:57,000 --> 00:06:00,000 আমরা Valgrind বাইরে এই প্রোগ্রাম চালানো বহুবার পারেন 117 00:06:00,000 --> 00:06:03,000 এবং কোনো ত্রুটি লক্ষণ দেখতে পাচ্ছেন না. 118 00:06:03,000 --> 00:06:06,000 >> যাইহোক, এবার একটি এই গোলাপী প্রকরণ এ দেখতে এর চেহারা 119 00:06:06,000 --> 00:06:09,000 কিভাবে যে খুব খারাপ পেতে পারেন. 120 00:06:09,000 --> 00:06:14,000 সুতরাং, মঞ্জুর, আমরা জিনিস অপব্যবহারের ঠিক এই কোডের একটু বেশী হয়. 121 00:06:14,000 --> 00:06:17,000 আমরা কেবলমাত্র করছি হিপ দুটি পংক্তি জন্য স্থান বণ্টন 122 00:06:17,000 --> 00:06:19,000 cs50 পাথরের দৈর্ঘ্য, 123 00:06:19,000 --> 00:06:22,000 এই সময়, / 0 চরিত্র মনে. 124 00:06:22,000 --> 00:06:25,000 কিন্তু তারপর একটি অতি - দীর্ঘ স্ট্রিং আমরা মেমরি ব্লক সংযোজন করা 125 00:06:25,000 --> 00:06:27,000 যে, S যাও প্রতি নির্দেশ করা হয়. 126 00:06:27,000 --> 00:06:30,000 কি প্রভাব যে মেমরি ব্লক করা আছে যে দেয় T পয়েন্ট? 127 00:06:30,000 --> 00:06:34,000 ওয়েল, যদি মেমরি টি পয়েন্ট যে, S শুধু সন্নিহিত, 128 00:06:34,000 --> 00:06:37,000 এটা পরে আসছে, 129 00:06:37,000 --> 00:06:39,000 তারপর আমরা টি অংশ বেশী থাকতে পারে না 130 00:06:39,000 --> 00:06:41,000 চলুন এই কোড রান. 131 00:06:41,000 --> 00:06:43,000 কি ঘটেছে তাকান. 132 00:06:43,000 --> 00:06:47,000 স্ট্রিং আমরা আমাদের গাদা ব্লক উভয় সঞ্চিত আবির্ভাব মুদ্রিত সঠিকভাবে আউট. 133 00:06:47,000 --> 00:06:49,000 কিছুই মনে হয় এ সব ভুল. 134 00:06:49,000 --> 00:06:52,000 তবে, এর কোড আমাদের মধ্যে ফিরে যাওয়া এবং 135 00:06:52,000 --> 00:06:55,000 লাইন মন্তব্য আউট যেখানে আমরা cs50 স্কচ কপি 136 00:06:55,000 --> 00:06:59,000 দ্বিতীয় মেমরি ব্লক মধ্যে দ্বারা টন যাও, তীক্ষ্ন. 137 00:06:59,000 --> 00:07:02,000 এখন, যখন আমরা এই কোড রান আমরা should 138 00:07:02,000 --> 00:07:06,000 শুধুমাত্র দেখুন প্রথম মেমরি ব্লক বিষয়বস্তু আউট প্রিন্ট করা হবে. 139 00:07:06,000 --> 00:07:09,000 আরে, যদিও আমরা str কপি না 140 00:07:09,000 --> 00:07:12,000 দ্বিতীয় গাদা ব্লক মধ্যে যে কোন অক্ষর, এক দ্বারা T জোরাল, 141 00:07:12,000 --> 00:07:15,000 আমরা একটি মুদ্রণ পেতে আউট. 142 00:07:15,000 --> 00:07:18,000 প্রকৃতপক্ষে, স্ট্রিং আমরা আমাদের প্রথম ব্লক মধ্যে স্টাফ করা 143 00:07:18,000 --> 00:07:21,000 প্রথম ব্লক এবং ব্লকের মধ্যে দ্বিতীয় overran, 144 00:07:21,000 --> 00:07:23,000 ফলে সবকিছু স্বাভাবিক বলে মনে হচ্ছে. 145 00:07:23,000 --> 00:07:26,000 Valgrind, যদিও, আসল কথা বলে আমাদের. 146 00:07:26,000 --> 00:07:28,000 এখন পর্যন্ত আমরা যেতে. 147 00:07:28,000 --> 00:07:32,000 যারা অবৈধ সব সার্চ এবং লিখেছেন. 148 00:07:32,000 --> 00:07:36,000 >> চলুন ত্রুটির অন্য ধরনের একটি উদাহরণ তাকান. 149 00:07:36,000 --> 00:07:39,000 এখানে আমরা কিছু না বরং দু: খজনক. 150 00:07:39,000 --> 00:07:41,000 আমরা হিপ কোন int জন্য স্থান দখল, 151 00:07:41,000 --> 00:07:45,000 যে স্থান নির্দেশ করার জন্য - পি - এবং আমরা কোন int পয়েন্টার আরম্ভ. 152 00:07:45,000 --> 00:07:48,000 তবে, আমাদের পয়েন্টার সক্রিয়া করা হয়, 153 00:07:48,000 --> 00:07:52,000 তথ্য যে এটি মাত্র গাদা এর প্রতি নির্দেশ করে যে অংশ যাই হোক না কেন আবর্জনা করেনি হয়. 154 00:07:52,000 --> 00:07:55,000 সুতরাং যখন আমরা int তোমার মধ্যে যে তথ্য লোড, 155 00:07:55,000 --> 00:07:57,000 টেকনিক্যালি আমরা তোমার, আরম্ভ করা 156 00:07:57,000 --> 00:08:00,000 কিন্তু আমরা অপ্রয়োজনীয় তথ্য যাতে না. 157 00:08:00,000 --> 00:08:03,000 কল, জাহির যা একটি সহজ ডিবাগিং ম্যাক্রো 158 00:08:03,000 --> 00:08:06,000 যথাযোগ্যভাবে নামে গ্রন্থাগারের জাহির সংজ্ঞায়িত, 159 00:08:06,000 --> 00:08:09,000 প্রোগ্রাম যদি তার পরীক্ষা শর্ত বিফল পরিত্যাগ করবে না. 160 00:08:09,000 --> 00:08:11,000 মানে, যদি তোমার 0 হয় না. 161 00:08:11,000 --> 00:08:14,000 নাহলে স্ট্যাক স্পেস কি ছিল ভিত্তিতে পি যাও, সরু, 162 00:08:14,000 --> 00:08:18,000 এই প্রোগ্রাম এবং কখনও কখনও কাজ অন্যান্য সময়ে ব্যর্থ হতে পারে. 163 00:08:18,000 --> 00:08:20,000 যদি এটা কাজ করে, শুধু আমরা পেয়ে থাকেন ভাগ্যবান. 164 00:08:20,000 --> 00:08:24,000 কম্পাইলার এই ত্রুটি, পারিনি কিন্তু নিশ্চিত হবে Valgrind হবে. 165 00:08:24,000 --> 00:08:28,000 এখন পর্যন্ত আমরা ত্রুটি যা অপ্রয়োজনীয় তথ্য আমাদের ব্যবহার থেকে গৌন দেখুন. 166 00:08:28,000 --> 00:08:32,000 >> আপনি যখন গাদা মেমরি বরাদ্দ করা কিন্তু না অথবা এটি deallocate না এটি মুক্ত, 167 00:08:32,000 --> 00:08:34,000 যে একটি লিক বলা হয়. 168 00:08:34,000 --> 00:08:37,000 জন্য একটি ছোট, আকালিক প্রোগ্রাম চালানো এবং অবিলম্বে প্রস্থান করে, 169 00:08:37,000 --> 00:08:39,000 তথ্য ফাঁসের হয় মোটামুটি নিরীহ, 170 00:08:39,000 --> 00:08:42,000 কিন্তু জন্য বড় মাপে এবং / অথবা একটি প্রকল্প আয়ু, 171 00:08:42,000 --> 00:08:46,000 এমনকি সামান্য লিক কিছু প্রধান করে প্রাঙ্গন পারেন. 172 00:08:46,000 --> 00:08:49,000 CS50 জন্য, আমরা আপনাকে আশা না 173 00:08:49,000 --> 00:08:51,000 গাদা মেমরি বরাদ্দ করা যে আপনি সব freeing যত্ন, 174 00:08:51,000 --> 00:08:54,000 যেহেতু আমরা আপনার দক্ষতা সঠিকভাবে ম্যানুয়াল প্রক্রিয়া হ্যান্ডেল নির্মাণের চান 175 00:08:54,000 --> 00:08:56,000 সি দ্বারা প্রয়োজন 176 00:08:56,000 --> 00:08:59,000 এই কাজের জন্য আপনার একটি সঠিক প্রোগ্রাম থাকা উচিত 177 00:08:59,000 --> 00:09:03,000 এক এক malloc এবং বিনামূল্যে কল মধ্যে চিঠিপত্রের. 178 00:09:03,000 --> 00:09:06,000 সৌভাগ্যবসত, Valgrind মেমরি তথ্য ফাঁসের সঙ্গে খুব সাহায্য করতে পারেন. 179 00:09:06,000 --> 00:09:09,000 এখানে একটি ছিদ্রময় প্রোগ্রাম নামক leak.c যে বরাদ্দ 180 00:09:09,000 --> 00:09:13,000 হিপ বরাদ্দ স্থান অতিক্রম করে যাও, লিখেছেন, কিন্তু মুক্ত না. 181 00:09:13,000 --> 00:09:16,000 আমরা এবং তার Valgrind অধীন এটি চালানোর সঙ্গে এটা কম্পাইল, 182 00:09:16,000 --> 00:09:18,000 এবং আমরা দেখতে যে, যখন আমরা কোন মেমরি ত্রুটি আছে, 183 00:09:18,000 --> 00:09:20,000 আমরা এক লিক নেই. 184 00:09:20,000 --> 00:09:23,000 16 বাইট স্পষ্টভাবে হারিয়ে আছে, 185 00:09:23,000 --> 00:09:27,000 যার মানে হল যে মেমরি পয়েন্টার সুযোগ সালে যখন প্রোগ্রাম থেকে প্রস্থান ছিল না. 186 00:09:27,000 --> 00:09:30,000 এখন, আমাদের Valgrind লিক সম্পর্কে অনেক তথ্য টন দেয় না, 187 00:09:30,000 --> 00:09:35,000 কিন্তু যদি আমরা এই সামান্য নোট অনুসরণ করে যে এটি রিপোর্টের নীচে প্রতি দেয় নিচে 188 00:09:35,000 --> 00:09:38,000 সঙ্গে পুন: প্রকাশ যাও - লিক চেক = পূর্ণ 189 00:09:38,000 --> 00:09:41,000 ফাঁস মেমরির সম্পূর্ণ বিবরণ দেখার জন্য, 190 00:09:41,000 --> 00:09:44,000 আমরা আরো তথ্য পাবেন. 191 00:09:44,000 --> 00:09:46,000 এখন, এ গাদা সারাংশ, 192 00:09:46,000 --> 00:09:50,000 Valgrind আমাদেরকে বলে প্রাথমিকভাবে যেখানে মেমরি যা হারিয়ে গেছে বরাদ্দ ছিল. 193 00:09:50,000 --> 00:09:52,000 শুধু হিসাবে আমরা সোর্স কোড মধ্যে খুঁজছেন থেকে জানি, 194 00:09:52,000 --> 00:09:55,000 Valgrind আমাদের জানায় যে আমরা মেমরি অবাঞ্ছিতভাবে 195 00:09:55,000 --> 00:09:58,000 malloc একটি রেখা 8 leak.c মধ্যে কলে বরাদ্দ 196 00:09:58,000 --> 00:10:00,000 প্রধান ফাংশন. 197 00:10:00,000 --> 00:10:02,000 চমত্কার কেতাদুরস্ত. 198 00:10:02,000 --> 00:10:04,000 >> Valgrind এই পদ ব্যবহার করে তথ্য ফাঁসের শ্রেণীবদ্ধ: 199 00:10:04,000 --> 00:10:07,000 নিশ্চিতভাবে হারিয়ে গেছে - এই গাদা বরাদ্দ মেমরির 200 00:10:07,000 --> 00:10:10,000 যাও কোন প্রোগ্রাম আর একটি ইশারা আছে. 201 00:10:10,000 --> 00:10:14,000 Valgrind জানেন যে আপনি একবার পয়েন্টার ছিল কিন্তু যেহেতু এটি ট্র্যাক হারিয়ে গেছে. 202 00:10:14,000 --> 00:10:17,000 এই মেমরি স্পষ্টভাবে অবাঞ্ছিতভাবে হয়. 203 00:10:17,000 --> 00:10:20,000 পরোক্ষভাবে হারিয়ে গেছে - এই গাদা বরাদ্দ মেমরির 204 00:10:20,000 --> 00:10:24,000 যার ফলে এটা শুধুমাত্র পয়েন্টার হারিয়ে যায়. 205 00:10:24,000 --> 00:10:27,000 উদাহরণস্বরূপ, যদি আপনি একটি লিঙ্ক তালিকার প্রথম নোডের আপনার পয়েন্টার হারিয়ে, 206 00:10:27,000 --> 00:10:30,000 তারপর স্পষ্টভাবে প্রথম নোডের নিজেই হারিয়ে যাবে, 207 00:10:30,000 --> 00:10:34,000 যখন পরোক্ষভাবে পরবর্তী কোনো নোড বিচ্ছিন্ন করা হবে. 208 00:10:34,000 --> 00:10:37,000 হয়ত হারিয়ে গেছে - এই গাদা বরাদ্দ মেমরির 209 00:10:37,000 --> 00:10:41,000 যা কিনা একটি Valgrind নিশ্চিত পয়েন্টার বা না হয় হতে পারে না. 210 00:10:41,000 --> 00:10:44,000 এখনও পৌঁছানো যাচ্ছে গাদা বরাদ্দ মেমরির 211 00:10:44,000 --> 00:10:47,000 যা এখনও প্রোগ্রাম থেকে প্রস্থান একটি ইশারা আছে, 212 00:10:47,000 --> 00:10:50,000 যা সাধারণত এর অর্থ হল যে একটি বিশ্বব্যাপী এটি পরিবর্তনশীল পয়েন্ট. 213 00:10:50,000 --> 00:10:53,000 এই তথ্য ফাঁসের জন্য পরীক্ষা করার জন্য, তবে আপনাকে বিকল্প অন্তর্ভুক্ত থাকবে 214 00:10:53,000 --> 00:10:55,000 - এখনও-পৌঁছানো = হ্যাঁ 215 00:10:55,000 --> 00:10:58,000 মধ্যে Valgrind আপনার আবাহন. 216 00:10:58,000 --> 00:11:01,000 >> এই বিভিন্ন ক্ষেত্রে তাদের পরিষ্কার আপ জন্য বিভিন্ন কৌশল প্রয়োজন হতে পারে, 217 00:11:01,000 --> 00:11:05,000 কিন্তু তথ্য ফাঁসের অপনীত করা উচিত. 218 00:11:05,000 --> 00:11:08,000 দুর্ভাগ্যবশত, তথ্য ফাঁসের স্থাপন হার্ড না হতে পারেন, 219 00:11:08,000 --> 00:11:11,000 থেকে বিনামূল্যে কল ভুল আপনার প্রোগ্রাম তিরস্কার করতে পারেন. 220 00:11:11,000 --> 00:11:14,000 উদাহরণস্বরূপ, যদি আমরা invalid_free.c তাকান, 221 00:11:14,000 --> 00:11:18,000 আমরা খারাপ মেমরি deallocation একটি উদাহরণ দেখুন. 222 00:11:18,000 --> 00:11:21,000 কি হতে একটি একক কল সমগ্র ব্লক মুক্ত উচিত 223 00:11:21,000 --> 00:11:24,000 দ্বারা int_block যাও মেমরি তীক্ষ্ন, 224 00:11:24,000 --> 00:11:27,000 করেনি পরিবর্তে হয়ে একটি প্রচেষ্টা প্রতিটি int-আকারের অধ্যায় মুক্ত 225 00:11:27,000 --> 00:11:29,000 এর পৃথকভাবে মেমরি. 226 00:11:29,000 --> 00:11:32,000 এই catastrophically ব্যর্থ হবে. 227 00:11:32,000 --> 00:11:34,000 পরিস্ফুটন! ত্রুটি কি একটি. 228 00:11:34,000 --> 00:11:36,000 এটি অবশ্যই ভাল না. 229 00:11:36,000 --> 00:11:39,000 যদি আপনি ভুল এই ধরনের সঙ্গে, যদিও, আটকে এবং আপনি যেখানে যাও চেহারা জানি না করছি, 230 00:11:39,000 --> 00:11:41,000 আপনার নতুন সেরা বন্ধু উপর ভরসা করা. 231 00:11:41,000 --> 00:11:44,000 আপনি এটা অনুমিত - Valgrind. 232 00:11:44,000 --> 00:11:47,000 , Valgrind হিসাবে সবসময়, জানেন ঠিক কি খবর. 233 00:11:47,000 --> 00:11:50,000 alloc এবং বিনামূল্যে সংখ্যা আপ না মেলে. 234 00:11:50,000 --> 00:11:52,000 আমরা 1 alloc এবং 4 মুক্ত পেয়েছেন. 235 00:11:52,000 --> 00:11:55,000 এবং এছাড়াও Valgrind বলে আমাদের যেখানে প্রথম খারাপ বিনামূল্যে কল - 236 00:11:55,000 --> 00:11:58,000 এক যে বিস্ফোরণ সূত্রপাত - থেকে আসছে - 237 00:11:58,000 --> 00:12:00,000 লাইন 16. 238 00:12:00,000 --> 00:12:03,000 হিসাবে আপনি দেখতে পাবেন, খারাপ কল মুক্ত হয় খুব খারাপ, 239 00:12:03,000 --> 00:12:05,000 যাতে আমরা আপনার প্রোগ্রাম লিক লেট প্রস্তাব 240 00:12:05,000 --> 00:12:08,000 যখন আপনি পেয়ে কার্যকারিতা সঠিক কাজ করছি. 241 00:12:08,000 --> 00:12:12,000 তথ্য ফাঁসের জন্য খুঁজছেন শুরু শুধুমাত্র পরে সঠিকভাবে আপনার প্রোগ্রাম কাজ করছে, 242 00:12:12,000 --> 00:12:14,000 ছাড়া অন্য কোনো ত্রুটি. 243 00:12:14,000 --> 00:12:16,000 >> এবং যে সমস্ত আমরা এই ভিডিওর জন্য পেয়েছেন. 244 00:12:16,000 --> 00:12:18,000 এখন কি আপনার জন্য অপেক্ষা করছি? 245 00:12:18,000 --> 00:12:21,000 আপনার প্রোগ্রামের উপর Valgrind অধিকার এখন রান এ যান. 246 00:12:21,000 --> 00:12:25,000 আমার নাম Nate Hardison. এটি CS50. [CS50.TV]