Visual Studio में किसी एक थ्रेड को डीबग कैसे करें?


254

मेरे पास कुछ परियोजनाओं के साथ एक समाधान है। विभिन्न परियोजनाओं में कई ब्रेक-पॉइंट हैं। मैं इनमें से एक ब्रेक-पॉइंट को हिट करने वाले पहले थ्रेड को ट्रेस करना चाहता हूं और एक ही कोड-ब्लॉक में अन्य थ्रेड्स दर्ज करने के बावजूद उस सिंगल थ्रेड को ट्रेस करना जारी रखता हूं।

मुझे पता है कि यह ब्रेक-पॉइंट पर एक स्थिति को परिभाषित करने के माध्यम से संभव है, अर्थात, थ्रेड नाम = ... या थ्रेड आईडी = ... लेकिन मेरा मामला एक भारी लोड ASP.NET अनुप्रयोग है और जैसे ही मैं w3wp.exeकई को संलग्न करता हूं धागे ब्रेक-पॉइंट को मारेंगे। मैं एक जैसे कुछ बात की जरूरत है ThreadLocal<break-point>

क्या यह संभव है? यदि हां, तो कैसे?


7
@ पाओलो: यह वेब एप्लिकेशन एक बड़े वेब फार्म के दिल के रूप में काम करता है और परीक्षण परिदृश्यों में नकल करने के लिए छोटी गाड़ी की स्थिति असंभव है।
ज़ाक्रॉन

VS 2019 के लिए शायद आपको यह प्रयास करना चाहिए: stackoverflow.com/a/61868591/8579563
Gozo

जवाबों:


150

फ्रीज / थ्रेड थ्रेड्स एक गलत तरीका है क्योंकि अन्य थ्रेड्स किसी भी कोड को निष्पादित नहीं करते हैं।

सबसे सही और प्रयोग करने योग्य तरीका निम्नलिखित है:

  1. ब्रेकपॉइंट विंडो में Ctrl + A को हिट करें (सभी ब्रेकप्वाइंट का चयन करें)।
  2. राइट क्लिक करें और "फ़िल्टर ..." चुनें।
  3. "थ्रेडआईड = (वर्तमान थ्रेड आईडी)" दर्ज करें।

में विजुअल स्टूडियो 2015 और नए, प्रक्रिया समान है:

  1. ब्रेकपॉइंट विंडो में Ctrl + A को हिट करें (सभी ब्रेकप्वाइंट का चयन करें)।
  2. राइट क्लिक करें और "सेटिंग्स ..." चुनें।
  3. "शर्तें" जांचें और ड्रॉपडाउन में "फ़िल्टर" चुनें
  4. "थ्रेडआईड = (वर्तमान थ्रेड आईडी)" दर्ज करें।

तो सभी थ्रेड्स निष्पादित होते हैं, लेकिन डीबगर वर्तमान थ्रेड पर केवल हिट करता है।


51
क्या यह "स्टेप" डीबगर कमांड को अन्य थ्रेड्स में प्रवेश करने से रोकता है? वह एक बड़ी समस्या थी। मैं अपने धागे के माध्यम से आगे बढ़ रहा हूं और अचानक मैं कोड के पूरी तरह से असंबंधित हिस्से में हूं। मैं अब विजुअल स्टूडियो में विकसित नहीं होता, इसलिए मैं परीक्षण नहीं कर सकता।
मैट फोज

8
ब्रेकपॉइंट विंडो में राइट क्लिक करने पर कोई "फ़िल्टर" कमांड नहीं है ... और आप वैसे भी वर्तमान थ्रेड आईडी का कैसे पता लगा सकते हैं? - आप तत्काल खिड़की पर जा रहे हैं और टाइपिंग System.Threading.Thread.CurrentThread.ManagedThreadIdया कुछ और?
1

5
मेरे वीएस (2015, सामुदायिक संस्करण) में एक बार में कई ब्रेकप्वाइंट की सेटिंग्स को संशोधित करना संभव नहीं है। इस प्रकार फ़िल्टर को केवल एक के बाद एक सेट किया जा सकता है।
रॉबर्ट 4

5
मुझे हमेशा से यह समस्या रही है, और मैं अपनी पिछली नौकरी की कसम खा सकता था, मुझे एक सेटिंग मिली जिसने दृश्य स्टूडियो को ग्रहण की तरह काम किया जहां आप उस धागे से चिपके रहेंगे जिसके साथ आप काम कर रहे थे, लेकिन मैं इसे या कोई संदर्भ नहीं पा सकता हूं यह करने के लिए। मुझे आश्चर्य है कि अगर मैंने यह सपना देखा।
स्टू

7
-1 क्योंकि यह केवल ब्रेकप्वाइंट के लिए अनुमति देता है, लेकिन वास्तव में डिबग करने के लिए नहीं: एक से अधिक थ्रेड डीबग करने के लिए इस तरह से काम न करें।
सर्ज रोजैच

338

यहाँ मैंने क्या किया है:

  1. एक सशर्त विराम बिंदु सेट करें जो मुझे पता था कि केवल उस धागे पर मारा जाएगा जिसकी मुझे तलाश थी।

  2. एक बार जब ब्रेकपॉइंट हिट हो जाता है और आप अपने इच्छित थ्रेड में होते हैं, तो विजुअल स्टूडियो थ्रेड्स विंडो में (डिबगिंग करते समय, डिबग -> विंडोज -> थ्रेड्स), Ctrl+ A(सभी थ्रेड्स का चयन करने के लिए), और फिर Ctrlउस थ्रेड पर क्लिक करें जिस पर आप वर्तमान में हैं । आपके पास सभी थ्रेड्स होने चाहिए, सिवाय एक जिसे आप डिबग करना चाहते हैं।

  3. राइट-क्लिक करें, और "फ्रीज" चुनें।

अब, Visual Studio केवल थ्रेडेड थ्रेड के माध्यम से कदम रखेगा। ऐसा करते समय यह बहुत धीमा प्रतीत होता है, संभवतः क्योंकि इसमें सभी जमे हुए थ्रेड्स के माध्यम से लूप करना पड़ता है, लेकिन इसने मेरे बहु-थ्रेडिंग डिबगिंग के लिए कुछ पवित्रता ला दी।


1
यह मेरे लिए एक संदर्भ में काम नहीं करता है जहाँ मेरे पास लगभग 8 कार्य हैं जो विभिन्न थ्रेड में चल रहे हैं। मैं अन्य सभी थ्रेड्स और "स्टेप ओवर" को फ्रीज करता हूं, लेकिन आईडीई थोड़ी देर के लिए फ्रीज हो जाता है, फिर वैसे भी दूसरे थ्रेड पर कूदता है।
मेटा-नाइट

3
@ डिगो: मैं अब प्रोजेक्ट पर काम नहीं कर रहा हूं, लेकिन अगर यह एक को छोड़कर सभी थ्रेड्स को फ्रीज करने जा रहा है, तो यह उस परिदृश्य को बदल देगा, जिससे बग पैदा हो गया, क्योंकि थ्रेड्स बग्गी स्थिति में पूरक थे। यद्यपि यह एक सुरुचिपूर्ण समाधान है, ऐसा लगता है कि इस सुविधा को वीएस में एम्बेड किया जाना चाहिए।
Xaqron

3
@ मेटा-नाइट आपको मुख्य धागे को छोड़कर सभी थ्रेड्स को फ्रीज करना चाहिए । यदि आप ऐसा करेंगे तो यह आईडीई फ्रीज नहीं होगा
एलेक्स ज़ुकोव्स्किए

15

मैंने अभी एक Visual Studio 2010+ एक्सटेंशन जारी किया है जो वास्तव में वही है जो आप खोज रहे हैं। और यह मुफ्त है :)।

प्रस्तुतीकरण

यह विजुअल स्टूडियो एक्सटेंशन डेवलपर्स को मल्टी थ्रेडेड एप्लिकेशन डीबग करते समय आसानी से सिंगल थ्रेड पर ध्यान केंद्रित करने की अनुमति देने के लिए दो शॉर्टकट और टूलबार बटन जोड़ता है।

यह नाटकीय रूप से सभी थ्रेड्स को स्थिर / पिघलना करने के लिए थ्रेड्स विंडो में जाने की आवश्यकता को कम कर देता है, लेकिन इसके बाद की जरूरत है और इसलिए उत्पादकता में सुधार करने में मदद करता है।

विशेषताएं

केवल वर्तमान थ्रेड के लिए आगे निष्पादन को प्रतिबंधित करें। अन्य सभी थ्रेड्स को फ्रीज कर देगा। शॉर्टकट: CTRL + T + T या स्नोफ्लेक बटन। अगले एकल थ्रेड (आईडी पर आधारित) पर स्विच करें। वर्तमान थ्रेड को बदल देगा और अन्य सभी थ्रेड्स को फ्रीज कर देगा। शॉर्टकट: CTRL + T + J या अगला बटन।

इसे देखें गैलरी पर यहाँ , पर आधिकारिक पेज या Github रिपॉजिटरी


वीएस के कौन से संस्करण का उपयोग कर रहे हैं?
इरविन मेयर

मैंने एक्सटेंशन स्थापित किया, लेकिन इसे काम करने के लिए प्रबंधित नहीं किया (मेरी वर्तमान परियोजना के लिए, मैं VS2010 का उपयोग करता हूं)। [जिस तरह से मैंने सोचा था कि थ्रेड्स सक्रिय होने के साथ एक समस्या थी, बस जब थ्रेड्स बनाए जाते हैं, तो यह संभवतः मानक व्यवहार है इसलिए मैंने अपनी पिछली टिप्पणी हटा दी]।
WIP

3
मैं इसकी जाँच करने जा रहा हूँ। आप उस ग्रह के एकमात्र व्यक्ति हो सकते हैं जिसने Microsoft की सबसे बड़ी डिबगिंग विफलताओं में से एक को हल करने का कोई प्रयास किया हो।
स्टू

अफसोस, यह vs2012 पर स्थापित नहीं होगा। क्या आपके पास एक नया संस्करण है या क्या आप स्रोत कोड साझा करना चाहेंगे ताकि मैं इसे स्वयं बना सकूं?
स्टू

@stu कोड कोड यहां स्रोत पर है: singlethread.codeplex.com इसे वीएस 2012 और वीएस 2013 पर काम करना चाहिए लेकिन मैंने इसे अपडेट नहीं किया है (किसी ने भी इसका अनुरोध नहीं किया है और मुझे इसकी आवश्यकता नहीं है)। यदि आप इसे वीएस 2012+ के साथ आसानी से काम कर सकते हैं और कोडप्लेक्स पर कमिट कर सकते हैं तो मैं इसे गैलरी पर भी पुश कर सकता हूं।
इरविन मेयर

13

यदि कई थ्रेड्स को वेब अनुप्रयोग के लिए देखा जा रहा है, तो @MattFaus उत्तर काम नहीं करेगा। मैंने इसके बजाय जो किया वह निम्नलिखित है

  • मुझे जो फ़ंक्शन चाहिए उसमें थ्रेड को बाधित करने के लिए एक ब्रेकपॉइंट सेट करें।
  • एक बार जब धागा ब्रेकपॉइंट पर पहुंच जाता है और रोक दिया जाता है, तो मैं ब्रेकपॉइंट हटा देता हूं और F8, F10 और F11 का उपयोग करके डीबग करना जारी रखता हूं, ताकि अन्य थ्रेड्स चल सकें।

Aftre सभी शीर्ष aserws को पढ़ने, इस समाधान मेरे लिए काम किया।
स्वानंद पंगम

9

एक से थोड़ा अलग दृष्टिकोण है जो मैं का उपयोग किया है:

  1. एक सामान्य ब्रेकपॉइंट बनाएं और इसे हिट होने दें
  2. प्रबंधित थ्रेड ID के लिए अपनी थ्रेड विंडो में देखें जो आप वर्तमान डीबगिंग हैं
  3. ब्रेकपॉइंट विंडो और चयनकर्ता फ़िल्टर में अपने ब्रेकपॉइंट पर राइट क्लिक करें
  4. EnterId = xxx दर्ज करें जहां xxx 2 से थ्रेड आईडी है
  5. अब आप अन्य थ्रेड्स को रोकने के बिना डीबग कर सकते हैं और उनके बिना अपने ब्रेकपॉइंट को मार सकते हैं

यह मानता है कि आपके पास समय है ऊपर से एक दूसरे धागे को तोड़ने से पहले। यदि नहीं और अन्य थ्रेड्स आपके ब्रेकपॉइंट को हिट करते हैं, तो इससे पहले कि आप ऊपर कर चुके हैं आप उन्हें थ्रेड विंडो में राइट क्लिक कर सकते हैं और फ्रीज चुन सकते हैं।


3
+1। "यह मानता है कि आपके पास समय है ... इससे पहले कि एक दूसरा धागा आपके ब्रेकअप को हिट करे"। मैं एक अर्धविराम को ताले में लपेटता हूं और अर्धविराम पर एक विराम बिंदु रखता हूं। जब पहली बार ब्रेकपॉइंट मारा जाता है, तो मैं ब्रेकपॉइंट को अक्षम करता हूं। ताला के कारण कोई अन्य धागा नहीं आ सकता है। lock(m_someObject) { ; }
शाम

आपको Google को बचाने के लिए, थ्रेड विंडो डीबग> विंडोज> थ्रेड्स के तहत मिलती है।
गेब

2

वीएस 2019 में:

  1. कहीं एक ब्रेकपॉइंट सेट करें।
  2. F5 मारो (जारी रखें) जब तक आपका धागा नहीं आता है।
  3. इसे निकालने के लिए ब्रेकपॉइंट पर क्लिक करें।
  4. आप F10 या F11 के साथ थ्रेड को स्टेप कर सकते हैं।

VS2015 के लिए भी काम करता है!
prehistoricpenguin

1

मैं लाइव सर्वर पर एप्लिकेशन का एक और उदाहरण जोड़ने का सुझाव दूंगा, या तो एक ही हार्डवेयर या एक नई मशीन (इसे क्लस्टर) और फिर केवल उसी उदाहरण को डीबग करें। मैं कोड उपयोगकर्ताओं को ट्रिगर कर रहा हूं में एक ब्रेकप्वाइंट नहीं जोड़ूंगा। यदि वह विकल्प नहीं है, तो मैं और अधिक अनुरेखण जोड़ूंगा।

हालाँकि, यदि यह पूरी तरह से आवश्यक है और आपको समाधान स्टेट की आवश्यकता है, तो मुझे यकीन है कि आप एक ब्रेकप्वाइंट जोड़ सकते हैं जो आपके आईपी पते से अनुरोध आने पर ही टूट जाता है। आप एक सशर्त ब्रेकपॉइंट जोड़कर ऐसा करेंगे जो निरीक्षण करता है HttpContext.Request.UserHostAddress। ध्यान दें कि यह आपके आवेदन को काफी धीमा कर देता है।


यही मैंने कोशिश की है। समस्या यह है कि यह उदाहरण एक ही डोमेन (IP या किसी अन्य डोमेन पर चलने) पर काम नहीं कर रहा है और इससे कई प्रमाणपत्र समस्याएं (SSL, WCF, ...) हो जाती हैं और कम लोड के तहत छोटी गाड़ी की स्थिति कभी नहीं होती है!
Xaqron

क्षमा करें, मुझे यकीन नहीं है कि आपने इनमें से कौन सा प्रयास किया है, क्या आपने सशर्त ब्रेकपॉइंट की कोशिश की है?
स्टेपिनार

हां, मैंने उन्हें अद्वितीयता सुनिश्चित करने के लिए उनकी प्रबंधित आईडी के आधार पर नामित किया। फिर यह अनुमान लगाना कठिन है कि कौन सा आईडी असाइन किया गया है और एक अनुमान के आधार पर शर्त सेट करें। कभी-कभी अनुमान करीब होता है और कभी-कभी धागे को पकड़ने में लंबा समय लगता है।
ज़ाक्रॉन

1

यदि आप अन्य सभी थ्रेड्स को बंद नहीं करना चाहते हैं (हो सकता है कि आप विजुअल स्टूडियो डिबगर को एक रनिंग एप्लिकेशन में संलग्न कर रहे हों जो अनुरोधों का जवाब देने की आवश्यकता है), तो आप एक मैक्रो का उपयोग कर सकते हैं जो स्वचालित रूप से ब्रेकपॉइंट बनाते हैं और निकालते हैं।

यह स्टैक ओवरफ्लो प्रश्न "स्टेप ओवर" के जवाब में विजुअल स्टूडियो में मल्टीथ्रेडेड प्रोग्राम डिबगिंग के दौरान सुझाया गया है ।

हालाँकि, लिंक केवल यह बताता है कि लाइन द्वारा डिबग कैसे करें। मेरा सुझाव है कि आप केवल वर्तमान थ्रेड पर रुकने के लिए सभी ब्रेकपॉइंट्स (उदाहरण के लिए लाइन की दी गई सीमा में) को संशोधित करने के लिए मैक्रो को संशोधित करें (यदि आप इसके साथ सहज हैं)।


1

मुझे लगता है कि यह विज़ुअल स्टूडियो 2015 में थोड़ा अलग है। उन्होंने ब्रेकपॉइंट में कुछ चीजें बदल दी हैं, लेकिन यहां बताया गया है कि hzdbyte (ऊपर) से स्वीकृत उत्तर कैसे लागू किया जाए:

कोडिंग मार्जिन में ब्रेकपॉइंट पर, राइट-क्लिक करें> शर्तें> 'सशर्त अभिव्यक्ति' से 'फ़िल्टर' में बदलें। यह तब आपको ThreadId द्वारा फ़िल्टर करने की अनुमति देता है।

ब्रेकपॉइंट विंडो में ब्रेकपॉइंट पर वैकल्पिक रूप से, राइट-क्लिक करें> सेटिंग्स> स्थितियां बॉक्स पर टिक करें और ऊपर करें।


1

लाइन के साइड बार को राइट क्लिक करके ब्रेकपॉइंट कंडीशन सेट करें। "स्थिति" चुनें और उद्धरण में अपने धागे के नाम के साथ निम्नलिखित दर्ज करें:

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

वैकल्पिक रूप से आप "थ्रेड्स" विंडो से थ्रेड की "प्रबंधित आईडी" प्राप्त करके और उपयोग कर सकते हैं:

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.