ভিজ্যুয়াল স্টুডিওতে কীভাবে একটি একক থ্রেড ডিবাগ করবেন?


254

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

আমি জানি ব্রেক ব্রেক-পয়েন্টে শর্ত নির্ধারণের মাধ্যমে এটি সম্ভব, অর্থাৎ থ্রেডের নাম = ... বা থ্রেড আইডি = ... তবে আমার ক্ষেত্রে একটি ভারী বোঝা ASP.NET অ্যাপ্লিকেশন এবং যত তাড়াতাড়ি আমি w3wp.exeঅনেকগুলি সংযুক্ত করি থ্রেডগুলি ব্রেক পয়েন্টগুলিতে আঘাত করবে। আমি একটি মত কিছু জিনিস প্রয়োজন ThreadLocal<break-point>

এটা কি সম্ভব? যদি তাই হয়, কিভাবে?


7
@ পাওলো: এই ওয়েব অ্যাপ্লিকেশনটি একটি বৃহত ওয়েব ফার্মের কেন্দ্রস্থল হিসাবে কাজ করে এবং বগি পরিস্থিতি পরীক্ষার পরিস্থিতিতে নকল করা অসম্ভব।
Xaqron

ভিএস 2019 এর জন্য সম্ভবত আপনার এটি ব্যবহার করা উচিত: স্ট্যাকওভারফ্লো.com
Gozo

উত্তর:


150

থ্রেড জমা / গলানো একটি ভুল উপায় কারণ অন্য থ্রেডগুলি কোনও কোড চালায় না।

সর্বাধিক সঠিক এবং ব্যবহারযোগ্য উপায় হ'ল:

  1. ব্রেকপয়েন্ট উইন্ডোতে Ctrl + A টিপুন (সমস্ত ব্রেকপয়েন্টগুলি নির্বাচন করুন)।
  2. ডান ক্লিক করুন এবং "ফিল্টার ..." নির্বাচন করুন।
  3. "থ্রেডআইডি = (বর্তমান থ্রেড আইডি)" প্রবেশ করান।

ইন ভিসুয়াল স্টুডিও 2015 এবং নতুন, প্রক্রিয়া অনুরূপ:

  1. ব্রেকপয়েন্ট উইন্ডোতে Ctrl + A টিপুন (সমস্ত ব্রেকপয়েন্টগুলি নির্বাচন করুন)।
  2. ডান ক্লিক করুন এবং "সেটিংস ..." নির্বাচন করুন।
  3. "শর্তাবলী" পরীক্ষা করুন এবং ড্রপডাউনতে "ফিল্টার" নির্বাচন করুন
  4. "থ্রেডআইডি = (বর্তমান থ্রেড আইডি)" প্রবেশ করান।

সুতরাং সমস্ত থ্রেড কার্যকর করা হয়েছে, তবে ডিবাগারটি কেবল বর্তমান থ্রেডে আঘাত করে।


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

8
ব্রেকপয়েন্টস উইন্ডোতে ডান ক্লিকের কোনও "ফিল্টার" কমান্ড নেই ... এবং কীভাবে আপনি বর্তমান থ্রেড আইডিটি খুঁজে পাবেন? - আপনি কি তাত্ক্ষণিক উইন্ডোতে গিয়ে টাইপ করছেন System.Threading.Thread.CurrentThread.ManagedThreadIdবা কিছু?
BrainSlugs83

5
আমার ভিএসে (২০১৫, সম্প্রদায় সংস্করণ) একাধিক ব্রেকপয়েন্টের সেটিংস একবারে সংশোধন করা সম্ভব নয়। এইভাবে ফিল্টারটি একে একে সেট করা যায়।
রবার্ট 4

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

7
-1 কারণ এটি কেবল ব্রেকপয়েন্টের জন্য অনুমতি দেয়, কিন্তু আসলে ডিবাগ করতে পারে না: একক থ্রেড ডিবাগ করার জন্য ধাপে ধাপে / ধাপে এইভাবে কাজ করবেন না।
সার্জ রোগাচ

338

আমি যা করেছি তা এখানে:

  1. একটি শর্তসাপেক্ষ বিরতি বিন্দু সেট করুন যা আমি জানতাম যে আমি কেবল যে সুতোর সন্ধান করছি।

  2. একবার ব্রেকআপপয়েন্ট হিট হয়ে যায় এবং আপনি যে স্ট্রেডটিতে চান তা ভিজুয়াল স্টুডিও থ্রেডস উইন্ডোতে (ডিবাগ করার সময়, ডিবাগ -> উইন্ডোজ -> থ্রেডস), Ctrl+ A(সমস্ত থ্রেড নির্বাচন করতে), এবং তারপরে Ctrl+ আপনি বর্তমানে যে থ্রেডটিতে আছেন তা ক্লিক করুন । আপনি নির্বাচিত ডিবাগ করতে চান তা ছাড়া আপনার সমস্ত থ্রেড থাকা উচিত।

  3. ডান ক্লিক করুন, এবং "জমাট" নির্বাচন করুন।

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


1
এটি আমার জন্য এমন প্রসঙ্গে কাজ করে না যেখানে আমার প্রায় 8 টি কাজ বিভিন্ন থ্রেডে চলছে। আমি অন্য সমস্ত থ্রেড জমা করে "স্টেপ ওভার" করি তবে আইডিই কিছু সময়ের জন্য হিমশীতল হয়ে যায়, তারপরে যাইহোক অন্য থ্রেডে ঝাঁপিয়ে পড়ে।
মেটা-নাইট

3
@ ডিগো: আমি আর এই প্রকল্পে কাজ করছি না তবে যদি এটি ব্যতীত অন্য সমস্ত থ্রেড জমাট বাঁধতে থাকে, তবে এটি বাগের কারণ হিসাবে দৃশ্যধারণের পরিবর্তন ঘটবে, কারণ থ্রেডগুলি বগি পরিস্থিতিতে পরিপূরক ছিল। যদিও এটি একটি মার্জিত সমাধান, মনে হচ্ছে এই বৈশিষ্ট্যটি ভিএস-এ এম্বেড করা উচিত seems
Xaqron

3
@ মেটা-নাইট আপনি মেইন থ্রেড বাদে সমস্ত থ্রেড হিমায়িত করা উচিত । আপনি যদি এই মত করেন তবে এই আইডিই হিমায়িত হবে না
অ্যালেক্স

15

আমি সবেমাত্র একটি ভিজ্যুয়াল স্টুডিও 2010+ এক্সটেনশন প্রকাশ করেছি যা আপনি যা খুঁজছেন ঠিক তা করে। এবং এটি নিখরচায় :)।

উপহার

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

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

বৈশিষ্ট্য

কেবলমাত্র বর্তমান থ্রেডে আরও কার্যকরকরণ সীমাবদ্ধ করুন। অন্যান্য সমস্ত থ্রেড জমে যাবে। শর্টকাট: সিটিআরএল + টি + টি বা স্নোফ্লেক বোতাম। পরবর্তী একক থ্রেডে (আইডির উপর ভিত্তি করে) স্যুইচ করুন। বর্তমান থ্রেড পরিবর্তন করবে এবং অন্যান্য সমস্ত থ্রেড জমা করবে। শর্টকাট: সিটিআরএল + টি + জ বা নেক্সট বোতাম।

এটি পরীক্ষা করে দেখুন গ্যালারি এখানে , উপর সরকারী পৃষ্ঠা বা গিটহাব সংগ্রহস্থলের


আপনি ভিএস এর কোন সংস্করণ ব্যবহার করছেন?
এরউইন মায়ার

আমি এক্সটেনশনটি ইনস্টল করেছি, তবে এটি কাজ করতে পরিচালিত হয়নি (আমার বর্তমান প্রকল্পের জন্য, আমি VS2010 ব্যবহার করি)। [যেভাবে আমি থ্রেডগুলি সক্রিয় হওয়ার সাথে সাথে থ্রেডগুলি সক্রিয় হওয়ার ক্ষেত্রে যা সমস্যা হয়েছিল তা ঘটেছিল, সম্ভবত এটি স্ট্যান্ডার্ড আচরণ তাই আমি আমার আগের মন্তব্যটি সরিয়ে দিয়েছি]।
মুছুন

3
আমি এটি যাচ্ছি। আপনি গ্রহের একমাত্র ব্যক্তি হতে পারেন যিনি মাইক্রোসফ্টের বৃহত্তম ডিবাগিং ব্যর্থতাগুলির একটি সমাধান করার জন্য কোনও প্রচেষ্টা করেছেন।
স্টু

হায়, এটি vs2012 এ ইনস্টল হবে না। আপনার কি নতুন সংস্করণ রয়েছে বা আপনি কি সোর্স কোডটি ভাগ করে নেবেন যাতে আমি নিজেই এটি তৈরি করতে পারি?
স্টু

@ স্টু সোর্স কোডটি এখানে কোডেপ্লেক্সে রয়েছে : সিঙ্গলথ্রেড কোড কোডপ্লেক্স.কম এটি ভিএস 2012 এবং ভিএস 2013 এ কাজ করা উচিত তবে আমি এটি আপডেট করি নি (কেউই এটির জন্য অনুরোধ করেনি এবং আমার নিজের প্রয়োজনও হয়নি)। আপনি যদি ভিএস 2012+ দিয়ে এটি সহজে কাজ করতে পারেন এবং কোডপ্লেক্সে একটি প্রতিশ্রুতিবদ্ধ করতে পারেন তবে আমি এটিকে গ্যালারিতেও চাপ দিতে পারি।
এরউইন মায়ার

13

যদি ওয়েব অ্যাপ্লিকেশন হিসাবে একাধিক থ্রেড তৈরি করা হয় তবে @ ম্যাটফাউস উত্তরটি কার্যকর হবে না। পরিবর্তে আমি যা করেছি তা নিম্নরূপ

  • আমি চাইলে ফাংশনে থ্রেডটি বাধতে একটি ব্রেকপয়েন্ট সেটআপ করুন।
  • থ্রেডটি ব্রেকপয়েন্টে পৌঁছে গেলে এবং বিরতি দেওয়া হয়ে গেলে আমি ব্রেকপয়েন্টটি সরিয়ে ফেব্রুয়ারী, এফ 10 এবং এফ 11 ব্যবহার করে ডিবাগিং চালিয়ে যাচ্ছি যাতে অন্য থ্রেড চলতে পারে।

আফ্রি সমস্ত শীর্ষ anserws পড়া, এই কর্মক্ষেত্রটি আমার জন্য কাজ।
সোয়ানন্দ পানগাম

9

একজন সামান্য ভিন্ন পদ্ধতি যা আমি ব্যবহার করেছি:

  1. একটি সাধারণ ব্রেকপয়েন্ট তৈরি করুন এবং এটি আঘাত পেতে দিন
  2. পরিচালিত থ্রেড আইডিটির জন্য আপনার থ্রেড উইন্ডোটি সন্ধান করুন যা আপনি বর্তমান ডিবাগ করছেন
  3. ব্রেকপয়েন্টস উইন্ডো এবং সেল্টেস্টর ফিল্টারটিতে আপনার ব্রেকপয়েন্টটিতে ডান ক্লিক করুন
  4. থ্রেডআইডি = এক্সএক্সএক্স লিখুন যেখানে এক্সএক্সএক্স 2 থেকে থ্রেড আইডি
  5. আপনি এখন অন্য থ্রেড না থামিয়ে এবং আপনার ব্রেকপয়েন্টে আঘাত না করেই ডিবাগ করতে পারেন

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


3
+1 টি। "এটি ধরে নিয়েছে আপনার কাছে সময় আছে ... দ্বিতীয় থ্রেড আপনার ব্রেকপয়েন্টে আঘাত হানার আগে"। আমি একটি লকটিতে একটি সেমিকোলন জড়িয়ে রাখি এবং সেমিকোলনে একটি ব্রেকপয়েন্ট রাখি। যখন ব্রেকপয়েন্টটি প্রথমবার আঘাত করা হয় তখন আমি ব্রেকপয়েন্টটি অক্ষম করি। লকের কারণে অন্য কোনও থ্রেড আসতে পারে না। lock(m_someObject) { ; }
ব্লুডোগ

আপনাকে গুগল বাঁচাতে, থ্রেড উইন্ডোটি ডিবাগ> উইন্ডোজ> থ্রেডসের অধীনে পাওয়া যায়।
গাবে

2

ভিএস 2019 এ:

  1. কোথাও একটি ব্রেকপয়েন্ট সেট করুন।
  2. আপনার থ্রেড না আসা পর্যন্ত F5 (চালিয়ে যান) টিপুন।
  3. এটি সরাতে ব্রেকপয়েন্টে ক্লিক করুন।
  4. আপনি F10 বা F11 দিয়ে থ্রেডটি পদক্ষেপ নিতে পারেন।

VS2015 এর জন্যও কাজ করে!
প্রাগৈতিহাসিক নেভিগেশন

1

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

তবে এটি যদি একেবারে প্রয়োজনীয় হয় এবং আপনার সমাধানের স্ট্যাটাসের প্রয়োজন হয় তবে আমি নিশ্চিত যে আপনি কোনও ব্রেকপয়েন্ট যুক্ত করতে পারবেন যা কেবলমাত্র যদি আপনার আইপি ঠিকানা থেকে অনুরোধ আসে তবেই ব্রেক হয়ে যায়। আপনি শর্তযুক্ত ব্রেকপয়েন্টটি যা পরীক্ষা করে তা যোগ করে এটি করবেন HttpContext.Request.UserHostAddress। তবে খেয়াল করুন যে এটি আপনার অ্যাপ্লিকেশনটি যথেষ্টভাবে ধীর করে দেয়।


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

দুঃখিত, আমি নিশ্চিত নই আপনি এর মধ্যে কোনটি চেষ্টা করেছেন, আপনি কি শর্তযুক্ত ব্রেকপয়েন্টটি চেষ্টা করেছেন?
স্টেইনার

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

1

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

ভিজ্যুয়াল স্টুডিওতে মাল্টিথ্রেডেড প্রোগ্রামগুলি ডিবাগ করার সময় স্ট্যাক ওভারফ্লো প্রশ্ন "স্টেপ ওভার" এর উত্তরে এটি প্রস্তাবিত ।

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


1

আমি ভিজুয়াল স্টুডিও 2015 এ এটি কিছুটা আলাদা বলে মনে করি They ব্রেকআপপয়েন্টে তারা কয়েকটি জিনিস বদলেছে, তবে hzdbyte (উপরের) থেকে গৃহীত উত্তরটি কীভাবে প্রয়োগ করতে হবে তা এখানে:

কোডিং মার্জিনের ব্রেকপয়েন্টে ডান-ক্লিক> শর্তাদি> 'শর্তসাপেক্ষ এক্সপ্রেশন' থেকে 'ফিল্টার' এ পরিবর্তন করুন। এটি তখন আপনাকে থ্রেডআইড দ্বারা ফিল্টার করতে দেয়।

বিকল্পভাবে ব্রেকপয়েন্টস উইন্ডোতে ব্রেকপয়েন্টে, ডান ক্লিক করুন> সেটিংস> কন্ডিশন বক্সটি টিক চিহ্ন দিন এবং উপরের কাজটি করুন।


1

লাইনের পাশের বারটিতে ডান ক্লিক করে একটি ব্রেকপয়েন্ট শর্ত সেট করুন। "শর্ত" নির্বাচন করুন এবং আপনার থ্রেডের নাম সহ উদ্ধৃতিতে প্রবেশ করুন:

System.Threading.Thread.CurrentThread.Name == "name_of_your_thread"

বিকল্পভাবে আপনি থ্রেডের "পরিচালিত আইডি" "থ্রেডস" উইন্ডো থেকে পেয়ে তা করতে পারেন এবং ব্যবহার করুন:

System.Threading.Thread.CurrentThread.ManagedThreadId == your_managed_thread_id

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