একটি ডিবাগার কী এবং এটি কীভাবে আমাকে সমস্যাগুলি নির্ণয় করতে সহায়তা করতে পারে?


101

এটি একটি নতুন প্রোগ্রামার যাদের একটি প্রোগ্রামে সমস্যা আছে তাদের সহায়তা করার জন্য একটি সাধারণ-উদ্দেশ্য প্রশ্ন হওয়ার উদ্দেশ্যে তৈরি করা হয়েছে, তবে কীভাবে সমস্যার কারণ চিহ্নিত করতে ডিবাগার ব্যবহার করবেন তা জানেন না।

এই প্রশ্নটি আরও নির্দিষ্ট প্রশ্নের তিনটি শ্রেণি জুড়ে:

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

4
দারুন কাজ - এটি একটি সংশ্লিষ্ট আছে তাদের জন্য Q & A- "থেকে যেতে" ভাল হবে কৌশল ডিবাগ যেমন একটি ডিবাগার, অন্যান্য ডিবাগ সরঞ্জাম ব্যবহার (যেমন Valgrind), কৌশলগত printfs চাপ টেস্টিং, ডিভাইড এবং জয় করি, ইত্যাদি
পল আর

4
আমি @ পলআলআরের সাথে একমত, এফএকিউতে এই জাতীয় জিনিস থাকা উচিত।
নিকু স্টির্কা

উত্তর:


64

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

ডিবাগার ব্যবহার করা একটি প্রত্যাশিত প্রাথমিক দক্ষতা

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

কোনও ডিবাগার কীভাবে আপনাকে সহায়তা করতে পারে

একটি ডিবাগার ব্যবহার করে আপনি আবিষ্কার করতে পারেন যে কোনও ভেরিয়েবলের ভুল মান রয়েছে কিনা এবং আপনার প্রোগ্রামে কোথায় এর মানটি ভুল মানে পরিবর্তিত হয়েছে।

একক পদক্ষেপ ব্যবহার করে আপনি নিয়ন্ত্রণ প্রবাহটি আপনার প্রত্যাশার মতো কিনা তাও আবিষ্কার করতে পারেন। উদাহরণস্বরূপ, কোনও ifশাখা যখন আপনার প্রত্যাশা করা হয় তখন তা কার্যকর করা উচিত।

ডিবাগার ব্যবহারের বিষয়ে সাধারণ নোট

ডিবাগার ব্যবহারের সুনির্দিষ্টতা আপনি যে প্রোগ্রামিং ভাষাটি ব্যবহার করছেন তা ডিবাগারের উপর এবং কিছুটা কম মাত্রার উপর নির্ভর করে।

  • আপনার প্রোগ্রামটি ইতিমধ্যে চালিত কোনও প্রক্রিয়ার সাথে আপনি একটি ডিবাগার সংযুক্ত করতে পারেন । আপনার প্রোগ্রামটি আটকে থাকলে আপনি করতে পারেন।

  • অনুশীলনে আপনার প্রোগ্রামটি প্রথম থেকেই কোনও ডিবাগারের নিয়ন্ত্রণে চালানো সহজ হয়।

  • আপনি ইঙ্গিত যেখানে আপনার প্রোগ্রাম উৎস-কোড ফাইল এবং লাইন যা মৃত্যুদন্ড বন্ধ করা উচিত লাইন সংখ্যা ইঙ্গিত দ্বারা নির্বাহ বন্ধ করা উচিত, অথবা পদ্ধতি / ফাংশনের নাম যা প্রোগ্রাম বন্ধ করা উচিত (যদি আপনি যেমন বন্ধ করতে চান ইঙ্গিত দ্বারা মৃত্যুদন্ড কার্যকর পদ্ধতিতে প্রবেশের সাথে সাথে)। কারিগরি অর্থটি হ'ল যে ডিবাগারটি আপনার প্রোগ্রামটি বন্ধ করার জন্য ব্যবহার করে তাকে ব্রেকপয়েন্ট বলা হয় এবং এই প্রক্রিয়াটিকে ব্রেকপয়েন্ট নির্ধারণ করা হয়

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

  • আপনার প্রোগ্রাম এক্সিকিউটেবল বা বাইটকোড ফাইলগুলিতে ডিবাগিং প্রতীক তথ্য এবং আপনার উত্স-কোডের ক্রস-রেফারেন্স অন্তর্ভুক্ত না হলে ডিবাগার ব্যবহার করা খুব কঠিন can তোমার থাকতে পারে কম্পাইল (অথবা পুনরায় কম্পাইল) আপনার প্রোগ্রাম সামান্য ভিন্নভাবে তা নিশ্চিত করার জন্য তথ্য উপস্থিত। সংকলক যদি বিস্তৃত অপ্টিমাইজেশন করে তবে সেই ক্রস-রেফারেন্সগুলি বিভ্রান্তিকর হয়ে উঠতে পারে। অতএব আপনাকে অপ্টিমাইজেশন বন্ধ করে আপনার প্রোগ্রামটি পুনরায় সংকলন করতে হতে পারে ।


4
এটি অসম্পূর্ণ কারণ এটি সবার মধ্যে সবচেয়ে গুরুত্বপূর্ণ ডিবাগারটি মিস করে, এমন একটি যা স্ট্যাকওভারফ্লোতে প্রশ্নের সংখ্যা খুব উল্লেখযোগ্যভাবে হ্রাস করার সম্ভাবনা রাখে (আমি কমপক্ষে 20% দ্বারা পূর্বাভাস দিয়েছি) - জাভাস্ক্রিপ্ট ডিবাগার: ফায়ারব্যাগ, ক্রোম, ফায়ারফক্স, আই 9 + ইন্টিগ্রেটেড ডিবাগার , আইই 8- ভিজ্যুয়াল স্টুডিও ইত্যাদি
স্ল্যাবটম্যান

4
নোড.জেএস এর জন্যও - নোড ইন্সপেক্টর। তবে নোড.জেএস প্রোগ্রামাররা সাধারণ জাভাস্ক্রিপ্ট প্রোগ্রামার হিসাবে অনেক বেসিক এবং / অথবা ফিক্স-মাই-কোড প্রশ্ন জিজ্ঞাসা করে না।
slebetman

38

আমি যুক্ত করতে চাই যে একটি ডিবাগার সর্বদা নিখুঁত সমাধান নয় এবং সর্বদা ডিবাগিংয়ের সমাধানে যাওয়া উচিত নয়। এখানে কয়েকটি কেস রয়েছে যেখানে কোনও ডিবাগার আপনার পক্ষে কাজ না করতে পারে:

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

এই সমস্ত ক্ষেত্রে, হয় আপনার প্রোগ্রামটি হঠাৎ করে বন্ধ হয়ে যাওয়ার ফলে শেষের ফলাফলগুলি ভিন্ন হতে পারে, বা বাগের কারণে তৈরি হওয়া একটি লাইনের সন্ধানে ম্যানুয়ালি পদক্ষেপ নেওয়ার কারণে খুব ঝামেলা হয়। আপনার বাগটি ভুল আচরণ, বা ক্র্যাশ কিনা তা সমানভাবে ঘটতে পারে। উদাহরণস্বরূপ, যদি স্মৃতি দুর্নীতির কারণে ক্র্যাশ ঘটে, তখন ক্রাশটি ঘটে যায়, মেমরির দুর্নীতি প্রথম হয়েছিল সেখান থেকে খুব দূরে এবং কোনও কার্যকর তথ্য অবশিষ্ট নেই।

তাহলে, বিকল্পগুলি কী কী?

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

অন্তর্ভুক্তি ব্যবহারকারীর কাছে একবার প্রভাব ফেলেছে তার পরিবর্তে দৃser়তার সাথে ভুল মানগুলিকে ফাঁদে ফেলতে ব্যবহার করা যেতে পারে। আপনি যত দ্রুত একটি ভুল মান ধরেন, ততই ততই কাছাকাছি আসার সময় এটি তৈরি করে।

রিফ্যাক্টর এবং ইউনিট পরীক্ষা। যদি আপনার প্রোগ্রামটি খুব বড় হয় তবে এটি একবারে এক শ্রেণি বা একটি ফাংশন পরীক্ষা করা উপযুক্ত। এটিকে ইনপুট দিন এবং ফলাফলগুলি দেখুন এবং কোনটি আপনার প্রত্যাশা মতো নয়। একটি সম্পূর্ণ প্রোগ্রাম থেকে একটি একক ফাংশনে ত্রুটি সংকুচিত করতে সক্ষম হওয়া ডিবাগিং সময়ের ক্ষেত্রে একটি বিশাল পার্থক্য করতে পারে।

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

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


9
এটি একটি ভাল উত্তর হবে ... একটি পৃথক প্রশ্নের। এটি এই প্রশ্নের খারাপ উত্তর । সম্ভবত আপনার এই প্রশ্নটি জিজ্ঞাসা করা উচিত এবং এর উত্তর হিসাবে এটি পোস্ট করা উচিত।
রায়েডওয়াল্ড

7
আসল প্রশ্নটি "নতুন প্রোগ্রামারদের সহায়তা করুন যেমন একটি প্রোগ্রামে সমস্যা আছে" হিসাবে বর্ণনা করা হয়েছে, "এটি আমার প্রত্যাশিত আউটপুট উত্পাদন করে না" এবং "আমি স্ট্যাকের চিহ্নটি পরীক্ষা করেছি, তবে আমি এখনও সমস্যার কারণটি জানি না" । যার সবকটিই এই উত্তর দিয়ে সহায়তা করে। তদ্ব্যতীত, কোনও ডিবাগার কী করে তা ব্যাখ্যা করার সময়, এটি কী করে না তা ব্যাখ্যা করাও সমান গুরুত্বপূর্ণ ।
স্লাগফিলার 14

4
দুর্দান্ত উত্তর। আমি সবসময় বাগ খুঁজে পেতে ডিবাগারটিকে প্রধান সরঞ্জাম হিসাবে ব্যবহার করি। তবে এখন আমি এমন একটি প্রকল্পে কাজ করছি যেখানে একটি বিশাল অবকাঠামোগত উপাদান অনেকগুলি থ্রেড এবং প্রচুর নেটওয়ার্ক কোড (ক্লায়েন্ট / সার্ভার) ব্যবহার করছে এবং লক্ষ্য করুন যে ডিবাগারটিই আমাকে সর্বশেষে সাহায্য করে। আপনি অনেকগুলি বিষয় উল্লেখ করেছেন যেখানে আপনার ভাল পুরানো ডিবাগার (সর্বাধিক গুরুত্বপূর্ণ: লগিং) এর উপর নির্ভর করার পরিবর্তে আপনার সত্যিকার অর্থে একটি আলাদা সরঞ্জাম ব্যবহার করা উচিত।
টিম শ্মেলেটার

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

4
@ অ্যাক্সান কিছুটা হলেও, যদি আপনি দৃsert়তার সাথে ফাংশনটি বিরতিতে পরিচালিত হন, আপনি কলারটি পেতে কল স্ট্যাকটি ব্যবহার করতে পারেন। তবে এটি একা আপনাকে মানটির উত্স দেয় না কারণ মানটি সম্ভবত পূর্ববর্তী রেখা থেকে likely আপনাকে মূলত মানটি অনুসরণ করতে হয়, বিভিন্ন ভেরিয়েবলের মধ্য দিয়ে যায়। যদি ডেটাটি নেয় সে সম্পর্কে আপনার যদি ভাল ধারণা থাকে তবে আপনি কেবলমাত্র একগুচ্ছ লগ প্রিন্ট তৈরি করতে পারেন এবং যেখানে এটি "ভুল হয়" সংকীর্ণ করার চেষ্টা করতে পারেন। যদি তা না হয় তবে আপনার প্রতিটি পদক্ষেপের পিছনে মূলত প্রোগ্রামটির একটি পৃথক রান (ত্রুটি পুনরুত্পাদন করা) প্রয়োজন।
স্লগফিলার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.