বেশিরভাগ মানুষ ডিবাগিংকে বিজ্ঞানের চেয়ে বরং শিল্প হিসাবে বিবেচনা করে। এখানে যারা এটিকে একটি শিল্পের চেয়ে বিজ্ঞান হিসাবে বিবেচনা করে - তাদের জন্য নতুন সমস্যা / বাগ / সমস্যার মুখোমুখি হয়ে সাধারণত কোন প্রক্রিয়াটি ব্যবহার করেন?
বেশিরভাগ মানুষ ডিবাগিংকে বিজ্ঞানের চেয়ে বরং শিল্প হিসাবে বিবেচনা করে। এখানে যারা এটিকে একটি শিল্পের চেয়ে বিজ্ঞান হিসাবে বিবেচনা করে - তাদের জন্য নতুন সমস্যা / বাগ / সমস্যার মুখোমুখি হয়ে সাধারণত কোন প্রক্রিয়াটি ব্যবহার করেন?
উত্তর:
খুব সাধারণ শর্তে, আমি যা করি তা হ'ল:
সমস্যাটি আলাদা করার চেষ্টা করুন। বাগটি হাজির হওয়ার পরে কী পরিবর্তন হয়েছে তা চিন্তা করুন। আপনি কোথায় কাজ করছেন? আপনি কোডটির কোন অংশটি পরিবর্তন করছেন? আমার 99% বাগগুলি এইভাবে সমাধান করা হয়েছে। এটি সাধারণত মূর্খ কিছু।
সমস্যাটি কোথায় তা সম্পর্কে আমার যদি ধারণা থাকে তবে কোডটি কারণ হিসাবে মনে হচ্ছে তা ভাল করে দেখুন। এটি পড়ুন। এমনকি জোরে জোরে এটি পড়ুন। নিজেকে জিজ্ঞাসা করুন: "আমি কী অর্জন করার চেষ্টা করছি?" কিছু ধরণের সমস্যার জন্য: এর কিছু পার্শ্ব প্রতিক্রিয়া থাকতে পারে বা অন্য কোনও জায়গায় কোড দ্বারা এটি এমনভাবে প্রভাবিত করা যেতে পারে যা আমি ভাবিনি?
কী ভুল হয়েছে, কোথায় এবং কখন (নীচে দেখুন) বিশ্লেষণ করার জন্য বিভিন্ন উপায়ে চেষ্টা করুন।
যদি এখনও আমার কোনও ক্লু না থাকে, আমি আমার উত্সের পুরানো সংস্করণে একই সমস্যা আছে কিনা তা পরীক্ষা করে দেখি, আমার বিকাশের টাইমলাইনে সমস্যাটি প্রথম কখন প্রকাশ হয়েছিল find এটি করার জন্য আপনাকে একটি ভাল সংস্করণ নিয়ন্ত্রণ সিস্টেমের সাথে কাজ করতে হবে, যেমন গিট (গিটের ঠিক এই ধরণের ডিবাগিংয়ের জন্য বাইসেক্ট নামে একটি বৈশিষ্ট্য রয়েছে)।
এখনও যদি কোনও চিহ্ন না থাকে তবে কিছুক্ষণ বিরতি নিন .... এটি প্রায়শই সহায়তা করে।
অঙ্কন বোর্ডে ফিরে যান - আপনার প্রোগ্রামটি কীভাবে কাজ করবে বলে মনে করা হচ্ছে এবং এটি আসলে বোঝায় কিনা তা পর্যালোচনা করুন।
এটি সত্যই সমস্যার ধরণের উপর নির্ভর করে, তবে ধরেই নিচ্ছি যে সমস্যাটি কোথায় হতে পারে সে সম্পর্কে আমার একটি সাধারণ ধারণা রয়েছে তবে:
যদি আমার সন্দেহ হয় যে সমস্যাটি কোড / সাম্প্রতিক পরিবর্তনের কিছু অংশে রয়েছে তবে আমি প্রথমে কোডটি সরল করে কোডটি সরানোর / মন্তব্য করার / পরিবর্তন করার বা বাগটি অদৃশ্য হওয়ার জন্য যা কিছু পেতে চেষ্টা করব এবং তারপরে সমস্যাযুক্ত কোডটি ফিরিয়ে এনে একটি ব্যবস্থা নেব এটা ভাল চেহারা।
ব্রেকপয়েন্টগুলি (যদি সম্ভব হয় তবে আদৌ) দিয়ে একটি ডিবাগারটি চালান এবং কোথায় কী কী সমস্যা হয় সে সম্পর্কে আরও ভাল ধারণা পেতে আমার ডেটা যখন এটি খারাপ আচরণ শুরু করে তখন কীভাবে চেষ্টা করার চেষ্টা করে তা একবার দেখুন।
bzr qdiff
কমান্ডের সাহায্যে দেখতে সহজ ।
আমি পরীক্ষা চালিত বিকাশ ( টিডিডি ) ব্যবহার করার চেষ্টা করি । আমি একটি পরীক্ষা লিখি যা বাগের প্রতিরূপ তৈরি করে, তারপরে পরীক্ষাটি পাস করার চেষ্টা করুন। কখনও কখনও পরীক্ষা লেখার অভিনয়টি বাগটি খুঁজে পেতে সহায়তা করে।
এটি আমাকে বেশিরভাগ সময় ডিবাগার থেকে দূরে রাখে এবং বাগটি পুনরায় উত্পাদন প্রতিরোধ করতে রিগ্রেশন টেস্ট সরবরাহ করে।
কিছু লিঙ্ক:
বিজ্ঞান শব্দের জন্য বেশ কয়েকটি সংজ্ঞা রয়েছে, তবে মনে হচ্ছে আপনি সম্ভবত " বৈজ্ঞানিক পদ্ধতি " হিসাবে আরও নিখুঁতভাবে বলা যেতে পারে এমনটি উল্লেখ করছেন । বৈজ্ঞানিক পদ্ধতিটি সংক্ষেপে কিছু ঘটনাকে পর্যবেক্ষণ (সম্ভবত কোনও বাগ বা অপ্রত্যাশিত প্রোগ্রাম আচরণ) পর্যবেক্ষণ, আচরণের ব্যাখ্যা দেওয়ার জন্য একটি হাইপোথিসিস বা হাইপোথিসিস তৈরি করে এবং সম্ভবত এটি প্রমাণ করার জন্য পরীক্ষামূলকভাবে পরীক্ষা করা (সমস্যাটি নির্ভরযোগ্যভাবে পুনরুত্পাদনকারী একটি পরীক্ষা লেখা)।
যে ধরণের বাগ (প্রপঞ্চ) দেখা দিতে পারে তা ব্যবহারিকভাবে অবিরাম এবং কারও কারও অগত্যা একটি সু-সংজ্ঞায়িত প্রক্রিয়া প্রয়োজন হয় না। উদাহরণস্বরূপ, কখনও কখনও আপনি একটি বাগ পর্যবেক্ষণ করেন এবং আপনি তাত্ক্ষণিকভাবে জানেন যে কী কারণে এটি হয়েছে কারণ আপনি কোডের সাথে খুব পরিচিত। অন্যান্য সময়, আপনি জানেন যে কিছু ইনপুট দেওয়া (ক্রিয়া, পদক্ষেপের সিরিজ, ইত্যাদি), একটি ভুল ফলাফল ঘটে (ক্র্যাশ, খারাপ আউটপুট ইত্যাদি)। এই ক্ষেত্রে, এটি প্রায়শই খুব বেশি "বৈজ্ঞানিক" চিন্তাভাবনার প্রয়োজন হয় না। কিছু ধারণা অনুসন্ধানের জায়গা হ্রাস করতে সাহায্য করতে পারে, তবে একটি সাধারণ পদ্ধতি হ'ল একটি ডিবাগারে কোডটি সরাতে এবং জিনিসগুলি কোথায় খারাপ হয়ে যায় তা কেবল।
যদিও পরিস্থিতিগুলি আমি সবচেয়ে আকর্ষণীয় এবং সম্ভবত একটি বৈজ্ঞানিক প্রক্রিয়ার জন্য উপযুক্ত বলে মনে করি যেখানে আপনাকে শেষ ফলাফল দেওয়া হয় এবং এটি কীভাবে ঘটেছিল তা ব্যাখ্যা করতে বলে। এর একটি সুস্পষ্ট উদাহরণ হ'ল ক্র্যাশ ডাম্প। আপনি ক্র্যাশ ডাম্প লোড করতে পারেন এবং সিস্টেমের অবস্থা পর্যবেক্ষণ করতে পারেন এবং আপনার কাজটি কীভাবে সেই অবস্থায় রয়েছে তা ব্যাখ্যা করা। ক্র্যাশ (বা কোর) ডাম্প ব্যবহারকারীর দ্বারা সংজ্ঞায়িত হিসাবে একটি ব্যতিক্রম, অচলাবস্থা, অভ্যন্তরীণ ত্রুটি বা কিছু "অযাচিত" অবস্থা (উদাহরণস্বরূপ, আলস্যতা) প্রদর্শন করতে পারে। এই পরিস্থিতিতে আমি সাধারণত এই লাইন বরাবর পদক্ষেপগুলি অনুসরণ করি:
সংক্ষিপ্ত পর্যবেক্ষণ : প্রযোজ্য ক্ষেত্রে নির্দিষ্ট সমস্যাটিকে ঘিরে সরাসরি অধ্যয়নের তথ্য। এখানে সুস্পষ্ট বিষয়গুলি হ'ল কল স্ট্যাক, স্থানীয় ভেরিয়েবলগুলি যদি আপনি দেখতে পান তবে কোডের লাইনগুলি সমস্যাটি ঘিরে রয়েছে। এই ধরণের নির্দিষ্ট অবস্থান অধ্যয়ন সর্বদা প্রযোজ্য নয়। উদাহরণস্বরূপ, "ধীরে ধীরে" সিস্টেম অধ্যয়ন করার ফলে এর মতো সুস্পষ্ট প্রারম্ভিক অবস্থান নাও থাকতে পারে, তবে ক্রাশ বা অভ্যন্তরীণ ত্রুটির কারণে সম্ভবত তাত্ক্ষণিক এবং সুস্পষ্ট বিষয় হতে পারে। এখানে একটি নির্দিষ্ট পদক্ষেপটি হ'ল উইন্ডবজি (চালানো! ক্রাশ ডাম্পের উপর বিশ্লেষণ -v এবং এটি আপনাকে কী বলে তা দেখুন) এর মতো সরঞ্জাম ব্যবহার করা।
প্রশস্ত পর্যবেক্ষণ : সিস্টেমের অন্যান্য অংশ অধ্যয়ন করুন। সিস্টেমে সমস্ত থ্রেডের অবস্থা পরীক্ষা করুন, যে কোনও বৈশ্বিক তথ্য (ব্যবহারকারী / ক্রিয়াকলাপ / আইটেম, সক্রিয় লেনদেন / প্রক্রিয়া / উইজেট ইত্যাদি), সিস্টেম (ওএস) সম্পর্কিত তথ্য ইত্যাদি দেখুন যদি ব্যবহারকারী কোনও বাহ্যিক বিবরণ সরবরাহ করে , আপনি যা পর্যবেক্ষণ করেছেন তার সাথে মিলিত তাদের সম্পর্কে চিন্তা করুন। উদাহরণস্বরূপ, যদি তারা আপনাকে জানায় যে প্রতি মঙ্গলবার বিকেলে সমস্যাটি ঘটে থাকে তবে নিজেকে জিজ্ঞাসা করুন এর অর্থ কী হতে পারে।
প্রকল্প রচনা করা: এটি সত্যই মজাদার অংশ (এবং আমি এটি মজাদার হওয়ার বিষয়ে আগ্রহী নই)। বিপরীতে এটি প্রায়শই প্রচুর যৌক্তিক চিন্তাভাবনার প্রয়োজন। সিস্টেমটি কীভাবে বর্তমান অবস্থায় প্রবেশ করেছে তা ভেবে খুব উপভোগ্য হতে পারে। আমি সন্দেহ করি যে এটি একটি অংশ যা অনেকেই একটি শিল্প হিসাবে ভাবেন। এবং আমি মনে করি এটি হতে পারে যদি প্রোগ্রামারটি এলোমেলোভাবে কিছু এনে জিনিস ছুঁড়তে শুরু করে তবে কী লাঠি দেখছে। তবে অভিজ্ঞতার সাথে, এটি মোটামুটি সুসংজ্ঞায়িত প্রক্রিয়া হতে পারে। আপনি যদি এই মুহুর্তে খুব যুক্তিযুক্তভাবে চিন্তা করেন, তবে প্রায়শই সম্ভাব্য পথগুলির সেটগুলি নির্দিষ্ট করে দেওয়া সম্ভব হয় যা প্রদত্ত অবস্থার দিকে পরিচালিত করে। আমি জানি যে আমরা রাজ্য এস 5 এ আছি। এটি হওয়ার জন্য, এস 4 এ বা এস 4 বি এর প্রয়োজন হতে পারে এবং এস 4 এ এর আগে S3 ইত্যাদি হতে পারে More প্রায়শই এটি নয়, এমন একাধিক আইটেম থাকতে পারে যা প্রদত্ত অবস্থার দিকে পরিচালিত করতে পারে। কখনও কখনও এটি স্ক্র্যাচ প্যাডে একটি সহজ প্রবাহ বা রাষ্ট্রের চিত্র বা সময়-সম্পর্কিত পদক্ষেপের একটি সিরিজ লিখতে সহায়তা করতে পারে। এখানে প্রকৃত প্রক্রিয়াগুলি পরিস্থিতির উপর নির্ভর করে ব্যাপকভাবে পরিবর্তিত হবে তবে গুরুতর চিন্তাভাবনা (এবং পূর্ববর্তী পদক্ষেপে পুনরায় পরীক্ষা) এই সময়ে প্রায়শই এক বা একাধিক প্রশ্রয়জনক উত্তর সরবরাহ করবে। এছাড়াও মনে রাখবেন যে এই পদক্ষেপের একটি অত্যন্ত গুরুত্বপূর্ণ অংশটি অসম্ভব এমন জিনিসগুলি নির্মূল করা। অসম্ভবকে মুছে ফেলা সমাধানের জায়গাটি ছাঁটাইতে সহায়তা করতে পারে (শার্লক হোমস কী অসম্ভবকে দূর করার পরে কী বলেছিল তা সম্পর্কে মনে রাখবেন)। এছাড়াও মনে রাখবেন যে এই পদক্ষেপের একটি অত্যন্ত গুরুত্বপূর্ণ অংশটি অসম্ভব এমন জিনিসগুলি নির্মূল করা। অসম্ভবকে মুছে ফেলা সমাধানের জায়গাটি ছাঁটাইতে সহায়তা করতে পারে (শার্লক হোমস কী অসম্ভবকে দূর করার পরে কী বলেছিল তা সম্পর্কে মনে রাখবেন)। এছাড়াও মনে রাখবেন যে এই পদক্ষেপের একটি অত্যন্ত গুরুত্বপূর্ণ অংশটি অসম্ভব এমন জিনিসগুলি নির্মূল করা। অসম্ভবকে অপসারণ সমাধানের জায়গাটি ছাঁটাইতে সহায়তা করতে পারে (শার্লক হোমস আপনার অসম্ভবকে মুছে ফেলার পরে কী বলেছিল তা সম্পর্কে মনে রাখবেন)।
পরীক্ষা : এই পর্যায়ে, পূর্ববর্তী ধাপে প্রাপ্ত অনুমানের ভিত্তিতে সমস্যাটি পুনরুত্পাদন করার চেষ্টা করুন। আপনি যদি আগের পদক্ষেপে গুরুতর চিন্তাভাবনাটি করেন তবে এটি খুব সোজা হওয়া উচিত। কখনও কখনও আমি প্রদত্ত পরীক্ষায় সহায়তা করার জন্য কোড বেসটি "ঠকাই" এবং সংশোধন করি। উদাহরণস্বরূপ, আমি সম্প্রতি একটি ক্র্যাশটি অনুসন্ধান করেছি যা আমি সিদ্ধান্ত নিয়েছিলাম যে এটি একটি জাতি শর্তের। এটি যাচাই করার জন্য, অন্য থ্রেডটিকে "ডান" সময়ে খারাপ কাজ করার অনুমতি দেওয়ার জন্য আমি কয়েকটি কোডের লাইনের মধ্যে একটি স্লিপ (500) রেখেছি। "সত্যিকার" বিজ্ঞানে এটি অনুমোদিত কিনা তা আমি জানি না, তবে আপনার নিজের কোডটিতে এটি পুরোপুরি যুক্তিসঙ্গত।
আপনি যদি এটি পুনরুত্পাদন করতে সফল হন তবে সম্ভাবনাগুলি আপনি প্রায় সম্পন্ন হয়ে গেছেন (যা বাকি রয়েছে তা ঠিক করার সহজ পদক্ষেপ ... তবে এটি অন্য দিনের জন্য। রিগ্রেশন টেস্ট সিস্টেমে নতুন পরীক্ষাটি পরীক্ষা করে নেওয়ার বিষয়টি নিশ্চিত হন। এবং আমার উল্লেখ করা উচিত যে আমি জিব-ইন-গাল হিসাবে এটি সহজ হওয়া ঠিক করার বিষয়ে পূর্ববর্তী বিবৃতিটি চেয়েছিলাম। একটি সমাধান সন্ধান এবং এটি বাস্তবায়নের জন্য বিস্তৃত কাজ প্রয়োজন হতে পারে। এটি আমার মতামত যে বাগ সংশোধন করাটি ডিবাগিং প্রক্রিয়ার অংশ নয় বরং এটি উন্নয়ন। এবং যদি ঠিকঠাক জড়িত থাকে তবে এর জন্য কিছু পরিমাণ নকশা এবং পর্যালোচনা করা উচিত।
পরীক্ষার কেসটি হ্রাস করার চেষ্টা করুন। যখন এটি যথেষ্ট ছোট হয় তখন সাধারণত সম্পর্কিত কোডটি সমস্যার কারণ হয়ে থাকে তা সনাক্ত করা সহজ।
সম্ভবত একটি নতুন চেক ইন সমস্যা সৃষ্টি করছে এবং আগের দৈনিক বিল্ডটি ঠিক ছিল। সেক্ষেত্রে উত্স নিয়ন্ত্রণ থেকে আপনার পরিবর্তন-লগ আপনাকে কাকে ধরা উচিত তা সিদ্ধান্ত নিতে সহায়তা করবে।
এছাড়াও, আপনি যদি সি / সি ++ তে থাকেন তবে ভালগ্রাইন্ড চলমান বিবেচনা করুন বা মেমরি সম্পর্কিত সমস্যাগুলি আলাদা করতে বিশুদ্ধ করুন।
ডিবাগিংয়ের সবচেয়ে শক্ত অংশটি সমস্যাটিকে বিচ্ছিন্ন করা, বিশেষত যখন সমস্যাটি কয়েকটি স্তরের নীচে চাপা থাকে। কলেজে আমি সংগীত রেকর্ডিং অধ্যয়ন করেছি এবং অদ্ভুতভাবে এখানে একটি স্টুডিও ইলেকট্রনিক্স ক্লাস ছিল যা এখানে সরাসরি প্রযোজ্য। আমি সিস্টেমেটিক ডিবাগিং প্রক্রিয়াটির উদাহরণ হিসাবে একটি স্টুডিও পরিবেশ ডিবাগিং ব্যবহার করতে যাচ্ছি।
ডিবাগিং কোডটি আসলে এত আলাদা নয়। কোডটি ব্যতিক্রম ছুঁড়ে ফেলা হলে ডিবাগিং অনেক সহজ। আপনি এই ব্যতিক্রমটির স্ট্যাক ট্রেস থেকে পিছন দিকে ট্রেস করতে পারেন এবং মূল অবস্থানগুলিতে ব্রেক পয়েন্ট সেট করতে পারেন। সাধারণত আপনি কোনও ভেরিয়েবল সেট করার ঠিক পরে বা লাইনে যে পদ্ধতিটিকে কল করে যে ব্যতিক্রম ছুঁড়ে। আপনি দেখতে পাবেন যে এক বা একাধিক মান সঠিক নয়। যদি এটি সঠিক না হয় (একটি শূন্য হওয়া উচিত যখন না হওয়া উচিত, বা মানটি সীমা ছাড়িয়ে যায়) তবে এটি কেন সঠিক নয় তা আবিষ্কার করার প্রক্রিয়া। আইডিইতে ব্রেক পয়েন্টগুলি বৈদ্যুতিন পরীক্ষার পয়েন্টগুলির সমতুল্য (সার্কিটটি পরীক্ষা করার জন্য একটি মিটার পরীক্ষার জন্য নকশা করা)।
এখন, একবার আমার আসল সমস্যাটি কোথায় তা আবিষ্কার করার কঠিন অংশটি পেরিয়ে যাওয়ার পরে, ভবিষ্যতে এটি পরীক্ষা করার জন্য আমি কয়েকটি ইউনিট পরীক্ষা লিখব।
দুপুরের শেষ দিকে ট্র্যাক করার জন্য আমি যে দুষ্টু বাগগুলি নিয়ে লড়াই করেছি, তার সাথে আমার সর্বাধিক কার্যকর কৌশল হ'ল দাঁড়াতে এবং কয়েক মিনিটের জন্য দূরে চলে যাওয়া। সাধারণত ত্রুটির সম্ভাব্য উত্সগুলি সম্পর্কে নতুন ধারণাগুলি কেবল 30 সেকেন্ড পরে প্রবাহিত হতে শুরু করে।
আরও ব্যবহারিক আপোচারের জন্য:
বাগটি যদি কোনও আনহ্যান্ডেল ব্যতিক্রম সম্পর্কিত হয় - স্ট্যাক ট্রেসটি দেখুন। নাল রেফারেন্স, সূচকের বাইরে সূচি ইত্যাদি এবং আপনার নিজস্ব নির্ধারিত ব্যতিক্রমগুলি সর্বাধিক সাধারণ, আপনি এই বাগটি কোনও জুনিয়র দেবকে অর্পণ করতে পারেন, এটি সম্ভবত সহজ এবং একটি ভাল শেখার এক্সপ্রেস।
যদি এটি প্রতিটি মেশিনে না ঘটে তবে এটি সম্ভবত জাতি শর্ত / থ্রেডিং ইস্যুর একটি রূপ। এগুলি ট্র্যাক করার জন্য মজার মজার, এটিতে আপনার বিরক্তিকর প্রবীণ প্রোগ্রামার রাখুন। প্রচুর লগিং, ভাল জ্ঞান এবং ভাল সরঞ্জামগুলি এটি সম্পন্ন করে।
বাগের আর একটি বড় শ্রেণি হ'ল যখন পরীক্ষা দল বা ক্লায়েন্ট (গুলি) কোনও নির্দিষ্ট আচরণ পছন্দ করে না। উদাহরণস্বরূপ, তারা পছন্দ করে না যে আপনি ব্যবহারকারীর আইডি প্রদর্শন করার সিদ্ধান্ত নিয়েছেন বা সন্ধান করার সময় আপনি স্বয়ংক্রিয়ভাবে সম্পূর্ণ হয় না। এগুলি আসল বাগগুলি, আরও ভাল পণ্য পরিচালনা এবং আরও বিস্তৃত দর্শন সহ ডিভগুলি বিবেচনা করুন। কোনও বিকাশকারীকে যদি তিনি বিবেচনায় রেখে সিস্টেমটি তৈরি করেন তবে এটি "সমাধান" করতে তুলনামূলকভাবে স্বল্প সময় নেওয়া উচিত।
অন্যান্য সমস্ত বাগের 80% হ'ল একটি ভাল লগিং সিস্টেম থাকার মাধ্যমে এবং সেগুলি সমাধান করার জন্য পর্যাপ্ত তথ্য সংগ্রহের মাধ্যমে সমাধান করা হয়। Log4Net / Log4J এর মতো জটিল লগিং সিস্টেমগুলির একাধিক স্তরের সাথে বিল্ড-ইন ট্রেসিং ব্যবহার করুন
পারফরম্যান্স বাগগুলি তাদের নিজস্ব একটি বিভাগ, এখানে সোনার নিয়মটি হ'ল "প্রথমে পরিমাপ করুন, পরে ঠিক করুন!", এবং আপনি কতটা ডেভস সমস্যাটি অনুমান করছেন তা দেখে অবাক হবেন এবং কেবল এটি দেখার জন্য এটি ঠিক করার জন্য ডানদিকে যান পরে প্রতিক্রিয়া সময় মাত্র 3-4% হ্রাস।
আমার দুটি পদ্ধতির প্রবাহ রয়েছে:
Divide and Conquer
প্যারাডিজম অনুসরণ করে প্রতিটি ছোট ছোট অংশ জয় করুন ।এই পদ্ধতিগুলি আমাকে বেশিরভাগ সময় সাহায্য করেছে।