কনসোল / stdout এ মুদ্রণ একটি ভাল ডিবাগিং কৌশল?


11

ধরা যাক আমাদের এর মতো একটি ফাংশন রয়েছে:

public void myStart()
{
    for (int i = 0; i<10; i++) myFunction(i); 
}


private int myFunction(int a)
{

    a = foo(a);
    a = bar(a);
    return a; 
}

private int foo(int a)
{
    //do something here

    //something gnarly here

    //etc
    return aValue;
}

private int bar(int a)
{
    // do something here
    //return aValue;
}

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

যে কোনও প্রথম বর্ষের প্রোগ্রামার প্রথম জিনিসটি কনসোল / স্ট্যান্ড আউট প্রিন্ট করা হয় (ডিবাগার ব্যবহার শিখার আগে হ্যালো ওয়ার্ল্ড কীভাবে প্রিন্ট করতে হয় তা শিখেছি)।

উদাহরণস্বরূপ এই কোডটি ডিবাগ করার জন্য তারা নিম্নলিখিতগুলি করতে পারে:

private int myFunction(int a)
{
    print("before foo: a=" + a); 
    a = foo(a);
    print("before bar: a=" + a);
    a = bar(a);

    return a; 
}

private int foo(int a)
{
    //do something here
    print ("foo step1: a=" + a); 

    //something gnarly here
    print ("foo step2: a=" + a + " someOtherValue="+ someOtherValue + " array.length= " + someArray.length()); 
    //etc
    return aValue;
}

private int bar(int a)
{
    // do something here
    //return aValue;
}

এখন তারা কোডটি চালায়, তারা একটি বড় কনসোল প্রিন্ট আউট পেয়েছে, যা তারা যেখানে ভুল হয়ে যাচ্ছে তার সন্ধান করতে পারে।

অবশ্যই একটি বিকল্প, ব্রেকপয়েন্টগুলি সেট করা এবং প্রতিটি পয়েন্টে কোডের মধ্য দিয়ে পদক্ষেপ নেওয়া।

কনসোল মুদ্রণের একটি বড় সুবিধা হ'ল বিকাশকারী এক সাথে মানগুলির প্রবাহ দেখতে পাবে, পদক্ষেপের মাধ্যমে ক্লিক না করে ইত্যাদি etc.

তবে অসুবিধাটি হ'ল, আপনার কোডটি এই সমস্ত মুদ্রণ বিবৃতি দিয়ে ছাঁটাই করা হবে যা পরে অপসারণ করা দরকার।

(সম্ভবত কোনও ডিবাগারকে কোনও লগের জন্য নির্দিষ্ট মানগুলি মুদ্রণ করতে বলা সম্ভব?) ব্রেকপয়েন্টগুলি তখন কোডটি সংশোধন না করে সহজেই যুক্ত বা মুছতে পারে can)

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


1
আপনাকে কীভাবে একটি ডিবাগার ব্যবহার করতে হবে এবং সঠিক লগিং ফ্রেমওয়ার্ক ব্যবহার করতে হবে তা শিখতে হবে। এটি আপনাকে কনসোলে মুদ্রণের চেয়ে অনেক বেশি আনন্দিত করবে (যা সর্বদা বিদ্যমান না)।

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

উত্তর:


26

মুদ্রণ বিবৃতি এবং ডিবাগার পারস্পরিক একচেটিয়া নয়। বাগগুলি সনাক্ত করতে / সনাক্ত করার জন্য এগুলি আপনার কাছে কেবলমাত্র ভিন্ন সরঞ্জাম। যারা আছেন তারা দাবি করবেন যে তারা কখনই কোনও ডিবাগারকে স্পর্শ করেন না এবং এমন কিছু আছেন যাঁরা লেখেন এমন কোডের যে কোনও জায়গায় একটি লগিং / মুদ্রণ বিবৃতি নেই। আমার পরামর্শ হ'ল আপনি those দলের কোনও একটিতে থাকতে চান না।

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

সুতরাং, আপনার নির্দিষ্ট প্রশ্নের উত্তর দিতে। হ্যাঁ. সম্পাদনা সনাক্ত করতে প্রিন্ট ব্যবহার করা ভাল এবং ব্যাপকভাবে ব্যবহৃত ডিবাগিং কৌশল। যাহোক...

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

লগিং ফ্রেমওয়ার্ক ব্যবহার করা হচ্ছে ...

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

আপডেট: আপনি ঠিক জিজ্ঞাসা করেছিলাম শেষে আমি লক্ষ্য করেছি, "ডিবাগকারীকে কেবলমাত্র একটি নির্দিষ্ট মানকে একটি লগতে মুদ্রণের জন্য বলা সম্ভব"? আপনি কোন ডিবাগার ব্যবহার করেন তার উপর নির্ভর করে। ব্রেকআপপয়েন্টে আঘাত হানার পরে অনেক আধুনিক ডিবাগার আপনাকে অনুরোধ করার জন্য একটি ক্রিয়া সংজ্ঞায়িত করতে দেয়। কিছুতে (আমি এটি ভিএস এবং উইনডিবিজিতে করেছি), "এটি মুদ্রণ করুন এবং পুনরায় শুরু করুন" নির্দিষ্ট করা সম্ভব। ভিজ্যুয়াল স্টুডিও তাদের "ব্রেকপয়েন্ট" এর পরিবর্তে "ট্র্যাসপয়েন্টস" বলে calls


প্রথম অনুচ্ছেদের জন্য +1। ডিবাগার এবং লগগুলি দুটি খুব আলাদা সমস্যা সমাধান করে।
ব্লারফ্লাল

1
তবে আপনি কি একমত নন যে লগের স্টেটমেন্টগুলি কোডে রেখে অশুচি করে?
দ্বিজোহনস্টন

1
আপনি কোন ধরণের লগ স্টেটমেন্ট রেখে যান তা নির্ভর করে। আমি এইটি সন্ধান করেছি এবং সরিয়েছি: "লগার.অরর (" WHAT ")"। অন্যথায়, আমি লগিং কোডটি আমার বাকী কোডের মতোই আচরণ করি। এটি ফর্ম্যাট করুন, এটিকে সুন্দর দেখান এবং তথ্যবহুল করুন। হ্যাঁ, প্রতিটি অন্যান্য লাইনে একটি মুদ্রণ বিবৃতি ছিটিয়ে দেওয়া কিছুটা বেশি এবং আমার মাঝে এমন সময় নিতে হয়েছিল। তবে সাধারণত, পুরো ফাইলটিতে 10-20 লগ স্টেটমেন্ট থাকা (ফাইল / ক্লাস যুক্তিসঙ্গত আকারের এবং বিশাল নয়) মোটেও খারাপ নয়।
ডিএক্সএম

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

1
@ ইজকাটা: এটি সমস্ত আপনার নির্দিষ্ট বাগের নির্দিষ্টকরণের উপর এবং আপনার কোডটি ইতিমধ্যে কতটা লগিংয়ের উপর নির্ভর করবে। আমি যে বিষয়টি পারাপারের চেষ্টা করছি সেটি হ'ল লগিং স্টেটমেন্ট থাকার এবং সেগুলি বিভিন্ন স্তরে রাখার মূল্য সর্বদা থাকে: ERR -> সতর্কতা ... -> ডিবগ U আপনার যদি খুব নির্দিষ্ট কোনও কিছুর জন্য আরও প্রয়োজন হয় তবে নিশ্চিত হন যে কোনও উপায়ে মুদ্রণ বিবৃতি যুক্ত করা শুরু করুন। তবে লগিং স্টেটমেন্ট হিসাবে যে কেউ "মুদ্রণ" ব্যবহার করে তার আমার উত্তর, সর্বদা একটি কাঠামোতে চলে যাবে এবং এটি ব্যবহার শুরু করবে।
DXM

3

লগিং / মুদ্রণ এবং ডিবাগারগুলি পরিপূরক কৌশল যা বিভিন্ন স্ট্রিংহট এবং দুর্বলতা রয়েছে - উভয়ই ব্যবহার করা ভাল। তবে সামগ্রিকভাবে, আমি বলব যে বেশিরভাগ ক্ষেত্রেই ডিবাগারগুলি সর্বোত্তম সরঞ্জাম এবং লগিং / মুদ্রণ কেবলমাত্র এটির ক্ষেত্রে আরও ভাল সেগুলির জন্য ব্যবহৃত হয় first

ডিবাগারগুলির সুবিধা:

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

লগিং / মুদ্রণের সুবিধা:

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

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

1

কোনওভাবে স্ট্যান্ডার্ড আউটপুটে মুদ্রণ করা আপনার কোডটি ডিবাগ করার জন্য ভাল কৌশল হতে পারে

  • আমার কোডের বিভিন্ন স্তরে কী চলছে তা দেখতে আমি প্রচুর মুদ্রণ বিবরণী ব্যবহার করি বিশেষত যদি আমি ত্রুটিটি পুরোপুরি বুঝতে না পারি

  • অথবা সম্ভবত ত্রুটির কোনও বিশদ তথ্য নেই যা আমাকে কোডের কোন অংশটি সমস্যার কারণ করছে তা নির্দেশ করতে পারে।

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

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


3
এই পোস্টটি পড়ার চেয়ে শক্ত (পাঠ্যের প্রাচীর)। তুমি কিছু মনে করবে সম্পাদন করা একটি ভাল আকৃতি সেটিকে ing?
gnat

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