সি ++ এ বিভাগকরণের ত্রুটিগুলি ঠিক করা


95

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

বিভাগ বিভাগীয় ত্রুটি ত্রুটিগুলি সন্ধান এবং ঠিক করার জন্য ভাল পদ্ধতিগুলি কী কী?

উত্তর:


135
  1. এর সাথে আপনার অ্যাপ্লিকেশনটি সংকলন করুন -g, তারপরে আপনার বাইনারি ফাইলটিতে ডিবাগ প্রতীক থাকবে।

  2. gdbজিডিবি কনসোলটি খুলতে ব্যবহার করুন ।

  3. fileএটি কনসোলে আপনার অ্যাপ্লিকেশনটির বাইনারি ফাইলটি ব্যবহার এবং পাস করুন ।

  4. runআপনার অ্যাপ্লিকেশন শুরু করার জন্য যে কোনও যুক্তি ব্যবহার এবং পাস করুন ।

  5. সেগমেন্টেশন ফল্ট হওয়ার জন্য কিছু করুন ।

  6. টাইপ করুন btমধ্যে gdbকনসোলের একটি স্ট্যাক ট্রেস পেতে সেগমেন্টেশন ফল্ট


gএর প্রসঙ্গে এটি সংকলিত করার অর্থ কী CMake?
স্কুটজ

4
ডিবাগ বিল্ড প্রকার সক্ষম করুন। একটি উপায় cmake -DCMAKE_BUILD_TYPE=Debug
আন্তোনিন ডাসিমো

36

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


19

সমস্যা দেখা দেওয়ার আগে এটি যথাসাধ্য এড়াতে চেষ্টা করুন:

  • যতবার আপনি পারেন আপনার কোডটি কম্পাইল এবং চালান। ত্রুটিযুক্ত অংশটি সনাক্ত করা সহজ হবে।
  • নিম্ন-স্তরের / ত্রুটিযুক্ত প্রবণ রুটিনগুলি সজ্জিত করার চেষ্টা করুন যাতে আপনার খুব কমই মেমরির সাথে সরাসরি কাজ করতে হয় (আপনার প্রোগ্রামের মডেলাইজেশনে মনোযোগ দিন)
  • একটি পরীক্ষা-স্যুট বজায় রাখুন। বর্তমানে কী কাজ করছে, কী কী কাজ করছে না ইত্যাদি সম্পর্কিত একটি সংক্ষিপ্ত বিবরণ আপনাকে সমস্যাটি কোথায় তা নির্ধারণ করতে সহায়তা করবে ( বুস্ট পরীক্ষা একটি সম্ভাব্য সমাধান, আমি নিজে এটি ব্যবহার করি না তবে ডকুমেন্টেশন কী ধরণের বুঝতে সাহায্য করতে পারে) তথ্য অবশ্যই প্রদর্শিত হবে)।

ডিবাগিংয়ের জন্য উপযুক্ত সরঞ্জামগুলি ব্যবহার করুন। ইউনিক্সে:

  • জিডিবি আপনাকে বলতে পারে কোথায় আপনি ক্র্যাশ করেছেন এবং কোন প্রসঙ্গে আপনি তা দেখতে দেবেন।
  • ভালগ্রাইন্ড আপনাকে অনেকগুলি স্মৃতি-সম্পর্কিত ত্রুটি সনাক্ত করতে সহায়তা করবে।
  • জিসিসির সাথে আপনি জিডিসি , কলং সহ মুডফ্ল্যাপও ব্যবহার করতে পারেন এবং অক্টোবরের পর থেকে পরীক্ষামূলকভাবে এমএসভিসি আপনি ঠিকানা / মেমরি স্যানিটাইজার ব্যবহার করতে পারেন । এটি কিছু ত্রুটি সনাক্ত করতে পারে যা ভ্যালগ্রিন্ড না করে এবং কর্মক্ষমতা হ্রাস হালকা। এটি -fsanitize=addressপতাকা সহ সংকলন করে ব্যবহৃত হয় ।

অবশেষে আমি স্বাভাবিক জিনিসগুলি সুপারিশ করব। আপনার প্রোগ্রামটি যত বেশি পঠনযোগ্য, রক্ষণাবেক্ষণযোগ্য, পরিষ্কার এবং ঝরঝরে রয়েছে তত সহজে ডিবাগ করা সহজ।


5

ইউনিক্সে আপনি valgrindসমস্যাগুলি সন্ধান করতে ব্যবহার করতে পারেন । এটি নিখরচায় এবং শক্তিশালী। আপনি বরং এটি নিজে করতে চাই আপনি জমিদার করতে newএবং deleteযেখানে আপনি 1 বাইট আছে একটি কনফিগারেশন সেট আপ করার জন্য অপারেটরদের 0xDEADBEEFআগে ও প্রতিটি নতুন বস্তু পরে। তারপরে প্রতিটি পুনরাবৃত্তিতে কী ঘটে তা ট্র্যাক করুন। এটি সবকিছু ধরতে ব্যর্থ হতে পারে (আপনি সেই বাইটগুলি স্পর্শ করার নিশ্চয়তাও দিচ্ছেন না) তবে এটি অতীতে উইন্ডোজ প্ল্যাটফর্মে আমার জন্য কাজ করেছে।


4
ভাল এটি 1 এর চেয়ে 4 বাইট হবে ... তবে নীতিটি ঠিক আছে।
জোনাস ওয়াগনার

4
আমি কি আমার অ-প্রবেশমূলক হিপ ডিবাগারটি লিঙ্ক করতে পারি ? :-)
ফ্রেডওভারফ্লো

এটার জন্য যাও. আমরা এখানে অন্যকে সাহায্য করার জন্য তাই এমন কোনও কিছু যুক্ত করা উচিত যা সহায়তা করতে পারে।
Wheaties

যদিও ওভারলোডিং newএবং deleteএটি সুপার উপকারী হতে পারে তবে ব্যবহার -fsanitize=addressকরা একটি ভাল বিকল্প কারণ সংকলক সমস্যার জন্য রানটাইম সনাক্তকরণে সংকলন করবে এবং মেমরিটিকে স্বয়ংক্রিয়ভাবে স্ক্রিনে ফেলে দেবে যা ডিবাগিংয়ের পথটিকে সহজ করে তোলে।
তারিক ওয়েলিং

3

হ্যাঁ, পয়েন্টারগুলির সাথে সমস্যা আছে। খুব সম্ভবত আপনি এমন একটি ব্যবহার করছেন যা সঠিকভাবে আরম্ভ করা হয়নি, তবে আপনি ডাবল ফ্রি বা এরকম কিছু দিয়ে আপনার মেমরি পরিচালনা পরিচালনাতে গোলযোগ করছেন এমনটিও সম্ভব।

স্থানীয় ভেরিয়েবল হিসাবে অবিচ্ছিন্ন পয়েন্টারগুলি এড়ানোর জন্য, তাদের যখন কোনও অর্থবোধক মান দিয়ে আরম্ভ করা যায় তত বেশি পছন্দ হিসাবে (সম্ভবত এটি সম্ভবত সর্বদা সম্ভব নয়) ঘোষণা করার চেষ্টা করুন। কোডটি পরীক্ষা করে সেগুলি ব্যবহার করার আগে তাদের একটি মূল্য থাকবে বলে নিজেকে মনে করুন। যদি আপনার এতে অসুবিধা হয় তবে এগুলি একটি নাল পয়েন্টার ধ্রুবক (সাধারণত হিসাবে NULLবা হিসাবে লিখিত 0) এ শুরু করুন এবং তাদের পরীক্ষা করুন।

সদস্য মান হিসাবে অবিচ্ছিন্ন পয়েন্টারগুলি এড়ানোর জন্য, নিশ্চিত করুন যে তারা কন্সট্রাক্টরে সঠিকভাবে আরম্ভ করা হয়েছে, এবং অনুলিপি নির্মাণকারী এবং অ্যাসাইনমেন্ট অপারেটরগুলিতে সঠিকভাবে পরিচালিত হয়েছে। initমেমরি পরিচালনার জন্য কোনও ফাংশনের উপর নির্ভর করবেন না , যদিও আপনি অন্য আরম্ভের জন্য পারেন।

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

প্রযোজ্য ক্ষেত্রে স্মার্ট পয়েন্টার ব্যবহার করুন। এখানে বড় সুবিধাটি হ'ল, আপনি যদি তাদের কাছে লেগে থাকেন এবং এগুলি ধারাবাহিকভাবে ব্যবহার করেন তবে আপনি সম্পূর্ণরূপে লেখা এড়াতে পারবেন deleteএবং কোনও কিছুই ডাবল-মোছা হবে না।

সি-স্টাইল স্ট্রিং এবং অ্যারের পরিবর্তে যখনই সম্ভব সি ++ স্ট্রিং এবং ধারক ক্লাস ব্যবহার করুন। .at(i)পরিবর্তে ব্যবহার বিবেচনা করুন [i], কারণ এটি সীমা পরীক্ষা করতে বাধ্য করবে। আপনার সংকলক বা গ্রন্থাগারটি [i]কমপক্ষে ডিবাগ মোডে সীমা পরীক্ষা করতে সেট করা যেতে পারে কিনা তা দেখুন । বিভাগীয় ত্রুটিগুলি পুরোপুরি ভাল পয়েন্টারগুলিতে আবর্জনা লেখার বাফার ওভাররনগুলির কারণে ঘটতে পারে।

এই জিনিসগুলি করা বিভাগের ত্রুটিগুলি এবং অন্যান্য স্মৃতি সমস্যার সম্ভাবনা যথেষ্ট হ্রাস করবে। তারা নিঃসন্দেহে সমস্ত কিছু ঠিক করতে ব্যর্থ হবে এবং সে কারণেই আপনার এখন ভ্যালগ্র্যান্ড ব্যবহার করা উচিত এবং যখন আপনার সমস্যা নেই তখন এবং ভ্যালগ্রাইন্ড এবং জিডিবি যখন আপনি করবেন।


1

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

সমস্যাটি উত্থাপিত হওয়ার আগে এড়ানোর জন্য সব ধরণের "পদ্ধতি" রয়েছে। একটি গুরুত্বপূর্ণ হ'ল RAII।

তদ্ব্যতীত, আপনাকে এটিতে আপনার সেরা মনস্তাত্ত্বিক শক্তি ফেলে দিতে হবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.