C++-এ সেগমেন্টেশন ফল্টের কারণ কীভাবে খুঁজে পাবেন

C E Segamentesana Phaltera Karana Kibhabe Khumje Pabena



একটি সেগমেন্টেশন ফল্ট, এটি একটি বিভাজন ত্রুটি হিসাবেও পরিচিত, এটি একটি ধরণের ত্রুটি যা ঘটে যখন একটি প্রোগ্রাম একটি মেমরি বিভাগে পৌঁছানোর চেষ্টা করে যেখানে এটি অ্যাক্সেস করার জন্য অনুমোদিত নয়। যখন একটি বিভাজন ত্রুটি দেখা দেয়, তখন অপারেটিং সিস্টেম প্রোগ্রামটি বন্ধ করে দেয় যাতে এটি আরও সমস্যা সৃষ্টি না করে। এই ত্রুটিটি সাধারণত প্রোগ্রামের কোডে একটি বাগ বা একটি প্রোগ্রামিং ত্রুটি নির্দেশ করে যেমন একটি অপ্রচলিত পয়েন্টার অ্যাক্সেস করা, একটি নাল পয়েন্টারকে ডিরেফারেন্স করা বা একটি অ্যারের সীমার বাইরে যাওয়া।

বিভাজন ত্রুটিগুলি ডিবাগ করা চ্যালেঞ্জিং হতে পারে কারণ তারা প্রায়শই বিশদ ত্রুটি বার্তা প্রদান না করে ক্র্যাশ করে। যাইহোক, GDB (GNU ডিবাগার) এর মতো টুলগুলি ত্রুটির সময় প্রোগ্রামের অবস্থা এবং স্ট্যাক ট্রেস পরীক্ষা করে সেগমেন্টেশন ফল্টের উৎস সনাক্ত করতে সাহায্য করতে পারে।

এটি লক্ষ করা গুরুত্বপূর্ণ যে বিভাজন ত্রুটিগুলি সাধারণত প্রোগ্রামিং ত্রুটির কারণে হয় এবং বাগ হিসাবে বিবেচিত হয়। সমস্যাযুক্ত কোড পর্যালোচনা এবং সংশোধন করে তাদের ঠিক করা উচিত। বিভাজন ত্রুটির সাধারণ কারণগুলির মধ্যে রয়েছে:







  • নাল বা অপ্রাথমিক পয়েন্টার উল্লেখ করা
  • একটি অ্যারের সীমার বাইরে লেখা বা পড়া
  • একটি মেমরি ব্যবহার করা যা পূর্বে ডিলোকেটেড বা রিলিজ করা হয়েছে
  • স্ট্যাক ওভারফ্লো বা স্ট্যাক দুর্নীতি
  • অপ্রবর্তিত ভেরিয়েবল ব্যবহার করে

আপনার কোডটি যত্ন সহকারে পরীক্ষা করে এবং GDB-এর মতো ডিবাগিং টুল ব্যবহার করে, আপনি বিভাজন ত্রুটিগুলি সনাক্ত করতে এবং ঠিক করতে পারেন, আপনার প্রোগ্রামটি সঠিকভাবে কাজ করে এবং এই ত্রুটিগুলির সম্মুখীন না হয় তা নিশ্চিত করে।



GDB ডিবাগার

জিডিবি (জিএনইউ ডিবাগার) একটি শক্তিশালী ডিবাগিং টুল যা সেগমেন্টেশন ফল্ট সহ সংকলিত প্রোগ্রামগুলির সমস্যাগুলি সনাক্ত এবং বিশ্লেষণ করতে সহায়তা করে। এটি আপনাকে প্রোগ্রামের অবস্থা পরীক্ষা করতে, ব্রেকপয়েন্ট ট্রিগার করতে এবং এক্সিকিউশন ফ্লো পর্যবেক্ষণ করতে সক্ষম করে।



বিভাজন ত্রুটিগুলি ডিবাগ করার জন্য কার্যকরভাবে GDB ব্যবহার করতে, আপনাকে সক্রিয় ডিবাগিং প্রতীকগুলির সাথে আপনার C++ প্রোগ্রামটি কম্পাইল করতে হবে। এই চিহ্নগুলির মধ্যে প্রোগ্রামের গঠন, ভেরিয়েবল এবং ফাংশন সম্পর্কে অতিরিক্ত তথ্য রয়েছে যা ডিবাগিং প্রক্রিয়ায় সহায়তা করে।





GDB এর সাথে C++-এ সেগমেন্টেশন ফল্ট খোঁজা

এখানে একটি উদাহরণ কোড স্নিপেট যা একটি বিভাজন ত্রুটি সৃষ্টি করে:

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

int প্রধান ( ) {

int * ptr = nullptr ;

* ptr = 5 ;

ফিরে 0 ;

}

প্রথমে কোড ব্যাখ্যা করা যাক। তারপর, আমরা পূর্ববর্তী কোডে একটি বিভাজন ত্রুটি খুঁজে বের করার বিষয়ে ধাপে আলোচনা করব।



'#include ' প্রিপ্রসেসর নির্দেশিকা প্রয়োজনীয় হেডার ফাইল যোগ করে যা C++ এ ইনপুট এবং আউটপুট স্ট্রীম বৈশিষ্ট্যগুলি অফার করে।

main() ফাংশনের ভিতরে, int* টাইপের একটি পয়েন্টার ভেরিয়েবল 'ptr' এর একটি ঘোষণা রয়েছে। 'nullptr' মানটি পয়েন্টারের ইনিশিয়ালাইজেশন হিসাবে ব্যবহৃত হয় যা একটি বিশেষ নাল পয়েন্টার মান যা নির্দেশ করে যে এটি কোনও নির্দেশ করে না। বৈধ মেমরি অবস্থান।

নিম্নোক্ত লাইনে নাল পয়েন্টার 'ptr' দিয়ে ডিরেফারেন্স প্রচেষ্টা করা হয় যা হল '*ptr = 5;'। এই ক্ষেত্রে, যেহেতু 'ptr' 'nullptr' এ সেট করা হয়েছে, অ্যাক্সেস করার জন্য কোন বৈধ মেমরি অবস্থান নেই।

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

ধাপ 1: ডিবাগিং সিম্বল সক্রিয় করুন

শুরু করতে, সক্রিয় ডিবাগিং চিহ্নগুলির সাথে আপনার C++ প্রোগ্রামটি কম্পাইল করা নিশ্চিত করুন। সংকলনের সময় এক্সিকিউটেবল ফাইলে ডিবাগিং তথ্য প্রদান করতে, '-g' পতাকা ব্যবহার করুন। বিবেচনা করুন যেখানে আমাদের কাছে 'main.cpp' নামে একটি C++ ফাইল আছে।

$ g++ -g main.cpp -ও প্রধান

ধাপ 2: GDB চালান

প্রোগ্রামটি ডিবাগিং চিহ্নের সাথে কম্পাইল হয়ে গেলে, একটি আর্গুমেন্ট হিসাবে এক্সিকিউটেবল ফাইলটি পাস করে GDB চালান।

$ জিডিবি প্রধান

ধাপ 3: প্রোগ্রাম শুরু করুন

GDB প্রম্পটে 'রান' বা 'r' টাইপ করে প্রোগ্রামটি শুরু করুন:

$ ( জিডিবি ) চালান

আপনার প্রোগ্রাম তারপর চালানো শুরু হবে.

ধাপ 4: সেগমেন্টেশন ফল্ট সনাক্ত করুন

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

উদাহরণস্বরূপ: আসুন পূর্বে ব্যাখ্যা করা কোডটি বিবেচনা করা যাক যেখানে আমরা যখন নাল পয়েন্টার দ্বারা নির্দেশিত মেমরি অবস্থানে 5 এর মান নির্ধারণ করার চেষ্টা করি, তখন এটি একটি বিভাজন ত্রুটির কারণ হয়। প্রোগ্রামটি অবিলম্বে লাইনে সমাপ্ত হয় যেখানে সেগমেন্টেশন ফল্ট ঘটে।

GDB এর সাথে এই প্রোগ্রামটি চালানোর সময়, আপনি নিম্নলিখিতগুলির অনুরূপ আউটপুট দেখতে পাবেন:

এই আউটপুটটি নির্দেশ করে যে 'main.cpp' ফাইলের লাইন 5 এ প্রধান ফাংশনে একটি বিভাজন ত্রুটি ঘটেছে।

ধাপ 5: স্ট্যাক ট্রেস পরীক্ষা করুন

সেগমেন্টেশন ফল্ট সম্পর্কে আরও অন্তর্দৃষ্টি পেতে, আপনি 'ব্যাকট্রেস' কমান্ড বা সহজভাবে 'bt' ব্যবহার করে স্ট্যাক ট্রেস পরীক্ষা করতে পারেন। এই কমান্ডটি ফাংশন কলের ক্রম প্রদর্শন করে যা ক্র্যাশের দিকে নিয়ে যায়।

$ ( জিডিবি ) বিটি

স্ট্যাক ট্রেস প্রদর্শিত হয় যা সেগমেন্টেশন ফল্টের আগে কল করা ফাংশনগুলি নির্দেশ করে:

এই আউটপুটটি আমাদের বলে যে 'main.cpp' ফাইলের লাইন 5 এ প্রধান ফাংশনে সেগমেন্টেশন ফল্ট ঘটেছে।

ধাপ 6: ব্রেকপয়েন্ট সেট করুন

আরও তদন্ত করার জন্য, আপনি সেই পয়েন্টগুলিতে প্রোগ্রামের সঞ্চালন বন্ধ করতে কোডের নির্দিষ্ট লাইনগুলিতে ব্রেকপয়েন্টগুলি সেট করতে পারেন। এটি আপনাকে প্রোগ্রামের অবস্থা এবং ভেরিয়েবলগুলি পরিদর্শন করতে দেয়। উদাহরণ স্বরূপ, “main.cpp”-এর লাইন 5-এ একটি ব্রেকপয়েন্ট সেট করতে, নিম্নরূপ “break” কমান্ডটি ব্যবহার করুন:

$ ( জিডিবি ) বিরতি main.cpp: 5

এটি 'main.cpp' ফাইলের 5 লাইনে একটি ব্রেকপয়েন্ট সেট করে:

ধাপ 7: এক্সিকিউশন পুনরায় শুরু করুন

ব্রেকপয়েন্ট সেট করার পরে, 'কন্টিনিউ' কমান্ড বা সহজভাবে 'c' ব্যবহার করে প্রোগ্রামের এক্সিকিউশন পুনরায় শুরু করুন:

$ ( জিডিবি ) চালিয়ে যান

ব্রেকপয়েন্টে না পৌঁছানো পর্যন্ত প্রোগ্রামটি চলতে থাকে।

ধাপ 8: ভেরিয়েবল এবং কোড পরিদর্শন করুন

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

ধাপ 9: GDB প্রস্থান করুন

একবার আপনি ডিবাগিং শেষ করলে, আপনি 'quit' কমান্ড ব্যবহার করে GDB থেকে প্রস্থান করতে পারেন:

$ ( জিডিবি ) প্রস্থান

এটি C++ প্রোগ্রামগুলিতে বিভাজন ত্রুটিগুলি খুঁজে পেতে GDB ব্যবহার করার একটি প্রাথমিক ওভারভিউ প্রদান করে। GDB আরও অনেক বৈশিষ্ট্য এবং কমান্ড সরবরাহ করে যা ডিবাগিংয়ে সাহায্য করতে পারে এবং আপনি আরও গভীর তথ্যের জন্য GDB ডকুমেন্টেশন উল্লেখ করতে পারেন।

উপসংহার

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