"কেবলমাত্র ডিবাগ করুন" কোডটি কেবল "চালু" অবস্থায় চলতে হবে


94

আমি কিছু সি # "কেবলমাত্র ডিবাগ" কোড যুক্ত করতে চাই যা কেবল তখনই চালিত হয় যখন ডিবাগিং করা ব্যক্তি এটির জন্য অনুরোধ করে। সি ++ তে আমি নিম্নলিখিতগুলির মতো কিছু করতাম:

void foo()
{   
  // ...
  #ifdef DEBUG
  static bool s_bDoDebugOnlyCode = false;
  if (s_bDoDebugOnlyCode)
  {
      // Debug only code here gets executed when the person debugging 
      // manually sets the bool above to true.  It then stays for the rest
      // of the session until they set it to false.
  }
  #endif
 // ...
}

স্থানীয় স্ট্যাটিক্স না থাকায় আমি সি # তে ঠিক একই কাজ করতে পারি না।

প্রশ্ন : সি # তে এটি সম্পাদনের সর্বোত্তম উপায় কী?

  1. সি # প্রিপ্রোসেসর নির্দেশিকা ( #if/#endif DEBUG) সহ একটি বেসরকারী শ্রেণীর স্ট্যাটিক ক্ষেত্রটি ব্যবহার করা উচিত ?
  2. আমার কি শর্তসাপেক্ষ বৈশিষ্ট্য (কোডটি ধরে রাখতে) এবং তারপরে একটি বেসরকারী শ্রেণীর স্ট্যাটিক ক্ষেত্র ( সি # প্রিপ্রোসেসর নির্দেশাবলী দ্বারা বেষ্টিত নয়#if/#endif DEBUG ?) ব্যবহার করা উচিত?
  3. অন্যকিছু?

উত্তর:


147

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

#if DEBUG
private /*static*/ bool s_bDoDebugOnlyCode = false;
#endif

void foo()
{   
  // ...
#if DEBUG
  if (s_bDoDebugOnlyCode)
  {
      // Code here gets executed only when compiled with the DEBUG constant, 
      // and when the person debugging manually sets the bool above to true.  
      // It then stays for the rest of the session until they set it to false.
  }
#endif
 // ...
}

কেবলমাত্র সম্পূর্ণ হতে হবে, প্রোগ্রাম প্রবাহ নিয়ন্ত্রণ করতে প্রগমাস (প্রিপ্রোসেসর নির্দেশাবলী) কিছুটা ক্লেজ হিসাবে বিবেচিত হয়। "শর্তসাপেক্ষ" বৈশিষ্ট্যটি ব্যবহার করে .NET এর অর্ধেক সমস্যার অন্তর্নির্মিত উত্তর রয়েছে।

private /*static*/ bool doDebugOnlyCode = false; 
[Conditional("DEBUG")]
void foo()
{   
  // ...    
  if (doDebugOnlyCode)
  {
      // Code here gets executed only when compiled with the DEBUG constant, 
      // and when the person debugging manually sets the bool above to true.  
      // It then stays for the rest of the session until they set it to false.
  }    
  // ...
}

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


4
শেষ পর্যন্ত - পুরো প্রশ্নটি পড়েন এমন কেউ । ধন্যবাদ, ঠিক আছে - মনে হচ্ছিল এটি দীর্ঘতর সমাধানের মতো (দুটি প্রিপ্রোসেসর বিভাগ থাকা), তবে সম্ভবত এটি আমার পক্ষে যা করতে পারে এটি সেরা সি #।
ম্যাট স্মিথ

6
মেহ আপনি প্রিপ্রোসেসর নির্দেশিকার আরও দুটি লাইন যুক্ত করার কারণে আমি এই দীর্ঘকে ডাকব না।
কিথস

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

4
নোট করুন যে প্রিপ্রেসেসর আপনাকে জানায় যে প্রোগ্রামটি ডিবাগ মোডে সংকলন করছে, তবে ডিবাগারটি আসলে চলছে কিনা।
শেন

65

আপনি যা খুঁজছেন তা হ'ল

[ConditionalAttribute("DEBUG")]

গুণ

আপনি উদাহরণস্বরূপ যদি একটি পদ্ধতি লিখুন:

[ConditionalAttribute("DEBUG")]
public static void MyLovelyDebugInfoMethod(string message)
{
    Console.WriteLine("This message was brought to you by your debugger : ");
    Console.WriteLine(message);
}

আপনার নিজের কোডের ভিতরে আপনি এই পদ্ধতিতে যে কোনও কল করেন কেবলমাত্র ডিবাগ মোডে কার্যকর করা হবে। আপনি যদি প্রজেক্টটি রিলিজ মোডে তৈরি করেন, এমনকি "মাই লাভলিডিবুগইনফোথ মেথড" এ কল করুন উপেক্ষা করা হবে এবং আপনার বাইনারি থেকে ফেলে দেওয়া হবে।

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


4
অ্যাট্রিবিউট ব্যবহার করার সময়, আপনাকে "অ্যাট্রিবিউট" প্রত্যয়টি লিখতে হবে না। শর্তসাপেক্ষ = শর্তসাপেক্ষ অ্যাট্রিবিউট। একটি অ্যাট্রিবিউট শ্রেণীর "অ্যাট্রিবিউট" দিয়ে শেষ হওয়া উচিত তবে কোডটিতে অ্যাট্রিবিউট হিসাবে ব্যবহৃত হলে বাদ দেওয়া যেতে পারে। প্রত্যয়টি বাদ দিলে এটি পড়া সহজ।
এরিক ওয়েললেট

23

আপনি যদি এই প্রক্রিয়াটির সাথে কোনও ডিবাগার সংযুক্ত থাকাকালীন কেবল কোড চালানোর প্রয়োজন হয় তবে আপনি এটি চেষ্টা করতে পারেন।

if (Debugger.IsAttached)
{
     // do some stuff here
}

ধন্যবাদ! এটি হ'ল আমি যা চাইছিলাম: ডিবাগ করার সময় কনসোল উইন্ডোটি বন্ধ করা রোধ করতে শেষে একটি কনসোল করুন e রিডলাইন () করুন।
ভিভিএস

4

আমি মনে করি এটি উল্লেখ করার মতো হতে পারে যে [ConditionalAttribute]এটি System.Diagnostics;নেমস্পেসে রয়েছে। আমি পেলে কিছুটা হোঁচট খেয়েছি:

Error 2 The type or namespace name 'ConditionalAttribute' could not be found (are you missing a using directive or an assembly reference?)

প্রথমবার এটি ব্যবহার করার পরে (আমি ভেবেছিলাম এটি এখানে থাকত System)।


3

আপনি যদি ডিবাগ করেন কিনা তা জানতে চান, প্রোগ্রামে সর্বত্র। এটা ব্যবহার কর.

গ্লোবাল ভেরিয়েবল ঘোষণা করুন।

bool isDebug=false;

ডিবাগ মোড চেক করার জন্য ফাংশন তৈরি করুন

[ConditionalAttribute("DEBUG")]
    public static void isDebugging()
    {
        isDebug = true;
    }

ইনিশিয়াল পদ্ধতিতে ফাংশনটি কল করুন

isDebugging();

পুরো প্রোগ্রামে এখন। আপনি ডিবাগিংয়ের জন্য পরীক্ষা করতে পারেন এবং অপারেশনগুলি করতে পারেন। আশাকরি এটা সাহায্য করবে!


4
আফাইক: এটি এবং এর বৈকল্পিকগুলি কোনও প্রোগ্রাম ধোয়া ডিবাগ পতাকা সেটটি দিয়ে সংকলিত হয়েছে কিনা তা নিশ্চিত করার জন্য কেবল নিশ্চিত উপায় ।
লসমনোস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.