ত্রুটি সন্ধান করার পরে ডিবাগ কোডটি কি সর্বদা, বা যুক্ত করা উচিত?


35

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

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

উত্তর:


30

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


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

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

16

ডিবাগিংয়ের জন্য বিশেষত যুক্ত কোডটি উত্পাদন সফ্টওয়্যার থেকে সরানো উচিত।

এটি সম্পূর্ণ অপসারণ বা শর্তসাপেক্ষ সংকলনের বিভাগগুলিতে (সি / সি ++ / সি হিসাবে রয়েছে) আপনার এবং আপনার কোডিং মানের উপর নির্ভর করে।

এইটার জন্য অনেক কারণ আছে:

  1. এই কোডটি কার্যকর করা হয় বা কেউ যদি এর আউটপুট অ্যাক্সেস করতে পারে তবে সুরক্ষা সংক্রান্ত জটিলতা থাকতে পারে।
  2. এটি অ্যাপ্লিকেশনটি কমিয়ে দিতে পারে।
  3. অন্যান্য বিকাশকারীদের কোডটি (বা প্রকৃতপক্ষে নিজেই) লাইনটি 6 মাসের নিচে তাকানোর জন্য এটি বিভ্রান্তিকর হতে পারে।

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

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

16

ক্রিসএফ এবং আলারিক উভয়ের বৈধ পয়েন্ট রয়েছে; তাদের জন্য +1। আমি ব্যবহার করি এমন কমপক্ষে 5 টি বিভিন্ন ধরণের ডিবাগ কোড সনাক্ত করতে পারি।

  1. সময়ে একটি নির্দিষ্ট সময়ে সিস্টেমের ডাম্প করতে লগগুলি ব্যবহার করা।

    void function(...)
    {
        ...dump everything i know about.
    }
    
  2. এক্সিকিউশন চেক পয়েন্টগুলির জন্য লগগুলি ব্যবহার করে।

    void function(...)
    {
        ...got here 1
        ...got here 2
    }
    
  3. কোড যা প্রকৃতপক্ষে একটি নির্দিষ্ট শর্তটিকে সত্য হতে বাধ্য করে, তবে সাধারণ আচরণটি ভেঙে দেয়। উদাহরণ:

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

  5. অপারেশন লগিং - আলারিকের পোস্টটি দেখুন । এটি "অপারেশন লগিং" বলতে যা বোঝায় তার থেকে অনেক বেশি।

1, 2 এবং 3 সম্পূর্ণভাবে নেওয়া উচিত taking 4 এর মতো কিছু আমি সম্ভবত শর্তাধীন কোডটি সঙ্কলন করব। 5 এর জন্য, অ্যালারিক লগগুলিকে গতিশীলভাবে বন্ধ করতে সক্ষম হবার একটি দুর্দান্ত বিষয় ছিল। এটি বেশিরভাগ ক্ষেত্রে ক্রিসএফের বক্তব্যকে তার দ্বিতীয় বুলেটে সম্বোধন করতে পারে ।


1
এটি একটি ভাল সংক্ষিপ্তসার। যাইহোক, আপনি যদি এটির পরিবর্তে 1)… সহ 1.… (মার্কডাউন ফর্ম্যাটিং এটিকে তালিকাগুলি হিসাবে তুলে ধরে) এবং উদাহরণ কোডটি 8 স্পেসে ফাঁকা করে (আবার, যাতে মার্কডাউন এটিকে উদাহরণ হিসাবে তুলে ধরে) সঠিকভাবে ফর্ম্যাট করতে পারলে ভাল হয় would একটি তালিকার মধ্যে কোড)।
কনরাড রুডল্ফ

@ কনরাড রুডল্ফ: হয়ে গেছে।
গ্যাবলিন

3

এটি কোড কী করছে তার উপর নির্ভর করে। কিছু কোড যা ডিবাগিংয়ের জন্য ব্যবহৃত হয় তা যেমন রয়েছে তেমনি রেখে দেওয়া যেতে পারে এবং কিছুটিকে অপসারণ করা উচিত।

কোডটি সঠিকভাবে কাজ করার পরে কোনও পদ্ধতিতে পরামিতিগুলির বিশুদ্ধতা যাচাই করে তা কোডটি সর্বদা কার্যকর হয় না তবে কোডটি সঠিকভাবে কাজ করা অব্যাহত রাখে তা প্রায়শই এটি রাখা হয়।

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

নির্দিষ্ট বাগটি সন্ধান করার জন্য আপনি যে কোডটি জুড়েছেন সেগুলি বাগটি সন্ধানের পরে প্রায়শই মুছে ফেলা যায়।


2

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

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

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

আমি যে ডিবাগিংয়ের অভিজ্ঞতাটি পেয়েছি তা হ'ল কমান্ড-লাইন জিডিবি।

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

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

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

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


মাল্টি-থ্রেড অ্যাপ্লিকেশনগুলিতে বিপজ্জনক না হলে একটি ডিবাগার বেশ বেহুদা হতে পারে, তবে আমি আপনার লাল পতাকা-ইশ মন্তব্যটি পছন্দ করি।
পেমদাস

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

"আমি মনে করি নীতিগতভাবে ডিবাগ কোডের চেয়ে সঠিক সরঞ্জামগুলি সম্ভবত আরও ভাল সমাধান" এটি একটি বিপজ্জনক বক্তব্য;)। এমন কিছু সরঞ্জাম যা বিশ্লেষণের কিছু আগে আগে উপস্থিত রয়েছে তা চমৎকার হতে পারে তবে আমি আশঙ্কা করি যে বিকাশকারীরা বিশেষত নতুনের সরঞ্জামগুলির উপর খুব বেশি নির্ভরশীল হয়ে উঠতে শুরু করবে, 100 এর 15% কী তা নির্ধারণের জন্য কোনও ক্যালকুলেটর ব্যবহার করা দরকার।
পেমদাস

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

1

আমার এটিকে গ্রহণ করুন: আমি সাধারণত সম্পূর্ণরূপে মুছে ফেলা হয় এমন প্রশ্নে কোডটির মধ্যে বাগটি মেরে ফেলার জন্য ডিবাগ কোড ব্যবহার করা হত। বাইরের বাহিনীগুলির ফলে একটি বাগ মেরে ফেলতে ব্যবহৃত ডিবাগ কোড আমি সাধারণত মন্তব্য করি।


-1

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


-1

টিডিডি ব্যবহার করুন , সুতরাং আপনার পরীক্ষার কোডের সর্বদা এমন জায়গা থাকে যেখানে এটি এমনকি রক্ষণাবেক্ষণ করা হয়।


এই প্রশ্ন জিজ্ঞাসা উত্তর কিভাবে?
gnat

কারণ টিডিডি আপনাকে "ডিবাগ" বা টেস্ট কোডের দিকে নিয়ে যায় যা আপনাকে অপসারণ করতে হবে না।
ডেকেফগেমিং

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