ভ্যালগ্রিন্ডের সাথে C/C++ এ মেমরি লিক কিভাবে সনাক্ত করা যায়

Bhyalagrindera Sathe C C E Memari Lika Kibhabe Sanakta Kara Yaya



Valgrind হল একটি ব্যাপকভাবে ব্যবহৃত সফটওয়্যার প্রোগ্রাম ডিবাগ এবং প্রোফাইল যা প্রাথমিকভাবে C, C++ এবং অন্যান্য ভাষায় লেখা। এটি ডেভেলপারদের মেমরির ফাঁস সনাক্ত করতে, মেমরি অ্যাক্সেসের ত্রুটিগুলি ট্র্যাক করতে এবং তাদের প্রোগ্রামগুলির এক্সিকিউশন প্রোফাইলে সহায়তা করে৷

আপনি যখন ভ্যালগ্রিন্ডের অধীনে একটি প্রোগ্রাম চালান, তখন এটি গতিশীলভাবে প্রোগ্রামটির এক্সিকিউটেবল যন্ত্র তৈরি করে, এটি প্রোগ্রামের মেমরি ব্যবহার এবং কার্যকর করার আচরণ নিরীক্ষণ করার অনুমতি দেয়।

C++ এ মেমরি লিক

এটি লক্ষ করা গুরুত্বপূর্ণ যে Valgrind প্রাথমিকভাবে C এবং C++ প্রোগ্রামগুলির জন্য ডিজাইন করা হয়েছে এবং অন্যান্য ভাষার সাথে বা সমস্ত পরিস্থিতিতে কার্যকরভাবে কাজ নাও করতে পারে। অতিরিক্তভাবে, ভ্যালগ্রিন্ডের অধীনে একটি প্রোগ্রাম চালানো উল্লেখযোগ্যভাবে এটির সম্পাদনকে ধীর করে দিতে পারে, তাই এটি প্রায়শই উত্পাদন পরিবেশের পরিবর্তে বিকাশ এবং ডিবাগিংয়ের সময় ব্যবহৃত হয়।







যখন একটি গতিশীলভাবে তৈরি মেমরি সঠিকভাবে প্রকাশ করা হয় না, তখন এটি C/C++ এ মেমরি লিক হতে পারে যা উপলব্ধ মেমরি সংস্থানগুলি ধীরে ধীরে নিষ্কাশন করবে। এর ফলে অত্যধিক মেমরি খরচ হতে পারে এবং প্রোগ্রামের কর্মক্ষমতা নষ্ট হতে পারে।



ভালগ্রিড ইনস্টলেশন

একটি Linux সিস্টেমে Valgrind ইনস্টল করতে, একটি টার্মিনাল খুলুন এবং আপনার Linux বিতরণের জন্য নির্দিষ্ট প্যাকেজ ম্যানেজার ব্যবহার করে আপনার প্যাকেজ সংগ্রহস্থল আপডেট করুন। নিম্নলিখিত কমান্ডটি উবুন্টু এবং ডেবিয়ান-ভিত্তিক সিস্টেমের জন্য কাজ করে:



$ sudo উপযুক্ত আপডেট

ভ্যালগ্রিন্ড ইনস্টল করতে প্যাকেজ ম্যানেজার ব্যবহার করুন। আবার, আপনার লিনাক্স বিতরণের উপর নির্ভর করে কমান্ডটি পরিবর্তিত হতে পারে। উবুন্টু এবং ডেবিয়ান-ভিত্তিক সিস্টেমের জন্য নিম্নলিখিত কমান্ডটি ব্যবহার করুন:





$ sudo উপযুক্ত ইনস্টল নির্বাচনের গেট

অনুরোধ করা হলে, আপনার ব্যবহারকারীর পাসওয়ার্ড লিখুন এবং 'এন্টার' টিপুন। মনে রাখবেন যে সফ্টওয়্যারটি ইনস্টল করার জন্য আপনার ব্যবহারকারীর অ্যাকাউন্টের প্রশাসনিক সুবিধার প্রয়োজন৷ প্যাকেজ ম্যানেজার যেকোনো প্রয়োজনীয় নির্ভরতা সহ Valgrind ডাউনলোড ও ইনস্টল করে। প্রক্রিয়াটি কয়েক মিনিট সময় নিতে পারে।



ইনস্টলেশন প্রক্রিয়া শেষ হওয়ার পরে, আপনি যাচাইকরণের পদক্ষেপ হিসাবে নিম্নলিখিত কমান্ডটি কার্যকর করে Valgrind-এর সফল ইনস্টলেশন নিশ্চিত করতে পারেন:

$ নির্বাচনের গেট --সংস্করণ

এই কমান্ডটি Valgrind এর সংস্করণ তথ্য প্রদর্শন করে যদি এটি সফলভাবে ইনস্টল করা হয়।

এটাই! Valgrind এখন আপনার লিনাক্স সিস্টেমে ইনস্টল করা উচিত, এবং আপনি মেমরি লিক এবং অন্যান্য সমস্যার জন্য আপনার C/C++ প্রোগ্রামগুলি বিশ্লেষণ এবং ডিবাগ করতে এটি ব্যবহার করতে পারেন।

উবুন্টুতে একটি ফাইল তৈরি করা

প্রোগ্রামে কাজ শুরু করার জন্য, আমাদের প্রথমে উবুন্টুতে একটি ফাইল তৈরি করতে হবে। ফাইল তৈরির জন্য, আমরা ন্যানো টেক্সট এডিটর ব্যবহার করি। সুতরাং, আমরা টার্মিনালে কমান্ডটি নিম্নরূপ লিখি:

$ ন্যানো ফাইল 1

এখানে, ন্যানো হল টেক্সট এডিটরের নাম যা কার্যকর করা হচ্ছে। ন্যানো টেক্সট এডিটর ব্যবহার করে আপনি যে ফাইলটি খুলতে বা তৈরি করতে চান সেই ফাইলটির নাম 'ফাইল1' আর্গুমেন্টটি উপস্থাপন করে। ন্যানো ফাইলটি ইতিমধ্যেই বিদ্যমান থাকলে সম্পাদনার জন্য খোলে; যদি না হয়, এটি সরবরাহকৃত নামের সাথে একটি নতুন ফাইল তৈরি করে। যেহেতু আমাদের কাছে এমন একটি ফাইল নেই, এটি 'file1' নামের একটি নতুন নথি তৈরি করে।

একবার আপনি কমান্ডটি চালালে, ন্যানো সম্পাদক খুলবে, আপনাকে 'ফাইল1' ফাইলের বিষয়বস্তু প্রবেশ বা সম্পাদনা করার জন্য একটি ফাঁকা ক্যানভাস প্রদান করবে। আপনি সম্পাদকে বিদ্যমান সামগ্রী টাইপ বা আটকানো শুরু করতে পারেন।

এখন যেহেতু সমস্ত পূর্বশর্তগুলি অর্জন করা হয়েছে, আমরা C++ প্রোগ্রামগুলিতে মেমরি লিক সনাক্ত করতে Valgrind ব্যবহার করার জন্য কিছু উদাহরণ তৈরি করি।

উদাহরণ 1:

আমরা যে প্রথম উদাহরণটি প্রদান করি তা সি-তে লাইব্রেরি থেকে “malloc” ফাংশন ব্যবহার করে গতিশীল মেমরি বরাদ্দের একটি সহজ উদাহরণ প্রদর্শন করে।

# অন্তর্ভুক্ত করুন

int প্রধান ( )

{

চর * = malloc ( 102 ) ;

ফিরে 0 ;

}

এখানে কোডের একটি ব্রেকডাউন রয়েছে:

আমরা প্রথমে স্ট্যান্ডার্ড লাইব্রেরি হেডার ফাইল অন্তর্ভুক্ত করি যা গতিশীল মেমরি বরাদ্দ এবং ডিললোকেশনের জন্য malloc এর মতো ফাংশন সরবরাহ করে।

int main() লাইন প্রধান ফাংশন ঘোষণা করে। তারপর, char *a = malloc(102); একটি পয়েন্টার ভেরিয়েবল ঘোষণা করে 'a' ধরনের char* (পয়েন্টার থেকে char)। এটি 'malloc' ফাংশন ব্যবহার করে 102টি গৃহস্থালি উপাদানের (মোট 102 বাইট) একটি অ্যারের জন্য গতিশীলভাবে মেমরি বরাদ্দ করতে। মেমরি বরাদ্দের আকার, বাইটে প্রকাশ করা হয়, ম্যালোক ফাংশনে একটি ইনপুট হিসাবে পাঠানো হয় এবং এটি সদ্য তৈরি মেমরি ব্লকে একটি পয়েন্টার আউটপুট করে। char* পয়েন্টার 'a' এই পয়েন্টার মান নির্ধারণ করা হয়. অবশেষে, 'রিটার্ন 0;' প্রধান ফাংশনের সমাপ্তি বোঝায়।

সংক্ষেপে, এই কোডটি গতিশীলভাবে 'malloc' ব্যবহার করে 102টি char উপাদানের একটি অ্যারের জন্য মেমরি বরাদ্দ করে এবং পয়েন্টার 'a'-এ মেমরি ঠিকানা বরাদ্দ করে। যাইহোক, মনে রাখবেন যে কোডটি কোনোভাবেই বরাদ্দকৃত মেমরি ব্যবহার বা ম্যানিপুলেট করে না এবং বিনামূল্যে ব্যবহার করে মেমরির ডিললোকেশন অন্তর্ভুক্ত করে না।

যখন আমরা এই প্রোগ্রামটিকে Valgrind-এর মাধ্যমে “–leak-check=full” বিকল্প দিয়ে চালাই, তখন এটি একটি মেমরি লিক চেক করে এবং একটি আউটপুট রিপোর্ট প্রদান করে।

Valgrid দ্বারা উত্পাদিত আউটপুট রিপোর্ট নিম্নরূপ দেওয়া হয়:

উদাহরণ 2:

এই দৃষ্টান্ত দিয়ে শুরু করার জন্য, আমরা প্রথমে ন্যানো টেক্সট এডিটর ব্যবহার করে একটি 'test2' ফাইল তৈরি করি যেমনটি পূর্বে কমান্ড লিখে ব্যাখ্যা করা হয়েছে:

$ ন্যানো পরীক্ষা2

এখন, Valgrind ব্যবহার করে কোনো মেমরি লিক আছে কিনা তা পরীক্ষা করার জন্য আমরা একটি C++ প্রোগ্রাম লিখি:

# অন্তর্ভুক্ত করুন

# অন্তর্ভুক্ত করুন

# অন্তর্ভুক্ত

const int a_s = 3000 ;

int প্রধান ( ) {

int * ia = malloc ( আকার ( int ) * a_s ) ;

জন্য ( int i = 0 ; i < a_s; i++ ) {

এটা [ i ] = আমি;

}

srand ( সময় ( খালি ) ) ;

int rn = rand ( ) % a_s;

printf ( 'এটি[%d]: %d \n ' , rn, it [ rn ] ) ;

ফিরে 0 ;

}

চলুন প্রোগ্রাম মাধ্যমে পেতে.

কোডটিতে প্রয়োজনীয় হেডার ফাইল রয়েছে এবং 3000 এর মান সহ 'a_s' ধ্রুবক ভেরিয়েবলকে সংজ্ঞায়িত করে। main() ফাংশনের ভিতরে, int* টাইপের একটি পয়েন্টার 'ia' ঘোষণা করা হয় এবং মেমরিটি 'malloc' ব্যবহার করে গতিশীলভাবে বরাদ্দ করা হয়। ফাংশন 'sizeof(int) * a_s' এক্সপ্রেশনটি 'a_s' সংখ্যার পূর্ণসংখ্যা সংরক্ষণ করার জন্য মোট প্রয়োজনীয় মেমরি নির্ধারণ করে। 'ia' অ্যারের সমস্ত উপাদান তার অনুরূপ সূচক মান সহ 'for' লুপ দ্বারা আরম্ভ করা হয়। উদাহরণস্বরূপ, ia[0] হবে 0, ia[1] হবে 1, ইত্যাদি।

র্যান্ডম নম্বর জেনারেটর বর্তমান সময় ব্যবহার করে 'srand' ফাংশন ব্যবহার করে বীজ করা হয়। এটি নিশ্চিত করে যে প্রোগ্রামটি প্রতিবার চালানোর সময় র্যান্ডম পূর্ণসংখ্যার একটি অনন্য সেট তৈরি করে। 'র্যান্ড' ফাংশন একটি এলোমেলো সংখ্যা তৈরি করে এবং 'rn' রেন্ড() % a_s এর ফলাফলের সাথে বরাদ্দ করা হয়। মডুলাস অপারেটর “%” র্যান্ডম সংখ্যার পরিসরকে 0 এবং a_s – 1 এর মধ্যে সীমাবদ্ধ করে যা “ia” অ্যারের মধ্যে একটি বৈধ সূচকের সাথে মিলে যায়।

অবশেষে, প্রোগ্রামটি 'printf' ফাংশন ব্যবহার করে সংশ্লিষ্ট সূচক সহ 'ia' অ্যারের এলোমেলোভাবে নির্বাচিত সূচক 'rn' এ মান প্রিন্ট করতে।

যখন আপনি Valgrind এর মাধ্যমে এই প্রোগ্রামটি চালান, এটি নিম্নলিখিত আউটপুট রিপোর্ট তৈরি করে:

  একটি কম্পিউটার প্রোগ্রাম বর্ণনার একটি স্ক্রিনশট স্বয়ংক্রিয়ভাবে তৈরি

উপসংহার

আমরা একটি C++ প্রোগ্রামে মেমরি লিক সনাক্ত করতে Valgrind টুলের ব্যবহার আবিষ্কার করেছি। Valgrind ইনস্টলেশন গাইড প্রাথমিকভাবে প্রদান করা হয়. এর পরে, আমরা ন্যানো টেক্সট এডিটর ব্যবহার করে উবুন্টুতে একটি ফাইল তৈরির বিষয়ে বিস্তারিত বর্ণনা করেছি। শেষ পর্যন্ত, এই পূর্বশর্তগুলি ব্যবহার করে, আমরা তাদের মধ্যে মেমরি লিক পরীক্ষা করার জন্য দুটি C++ উদাহরণ কার্যকর করেছি। Valgrind দ্বারা উত্পন্ন প্রতিবেদনটিও সংযুক্ত করা হয়েছে যা প্রদত্ত ফাইলে মেমরি লিক দেখায়।