2011-11-18 11 views
25

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

पढ़ना:

मैं एक समाधान है जो सशर्त breakpoints (धागे के नाम के आधार पर) है मिलता है। हालांकि, मैं नहीं कह सकता कि "थ्रेड # 3" हमेशा रोचक मामले का इलाज करेगा, इसलिए मुझे प्रत्येक निष्पादन के लिए स्थिति बदलनी होगी। बहुत ज्यादा काम।

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

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

आदर्श समाधान सही धागा ढूंढना, इसे ध्वजांकित करना और फिर विजुअल स्टूडियो को कहना होगा: "केवल तभी तोड़ें जब वर्तमान धागा ध्वजांकित किया गया हो"।

क्या यह भी संभव है?

+0

तो थ्रेड के लिए मानदंड क्या है? – abatishchev

+0

मानदंडों को रोक दिया जाएगा धागा ध्वजांकित किया गया है – kamaradclimber

+0

अलगाव में अपना कोड परीक्षण करें। उदाहरण के लिए यूनिट परीक्षण के साथ। फिर आपको केवल थ्रेड इंटरैक्शन को डीबग करना होगा, डिबगिंग की तरह जहां आप * थ्रेड को फ्रीज नहीं करना चाहते हैं। –

उत्तर

2

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

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

+0

जो होगा एक संभावित समाधान। मुझे 2 drabacks दिखाई देते हैं हालांकि: मुझे अपने कोडेटो को डीबग करने की आवश्यकता है और मुझे एक (जटिल) ब्रेकपॉइंट प्रक्रिया (1 क्लिक बनाम क्लिक, कॉपी-अतीत, 1 क्लिक) के माध्यम से जाना होगा – kamaradclimber

+0

उन लोगों के लिए जो हाल ही में (मेरे जैसे) ट्यून करते हैं I यह पढ़ने का सुझाव दें [उत्तर जो इस कार्यवाही को विस्तृत करता है] (http://stackoverflow.com/a/38926833/1348138) थोड़ा और आगे। मैं मतदान का सुझाव भी देता हूं [यहां उल्लिखित सुझाव] (http://stackoverflow.com/a/31191208/1348138)। – robert4

6

जबकि डिबगिंग आप धागे विंडो में सभी धागे फ्रीज और एक थोड़ी देर हो चुकी केवल एक ही आप में रुचि रखते हैं फिर से शुरू।

+3

धन्यवाद, लेकिन यह सवाल का जवाब नहीं देता है: मैं चाहता हूं कि एप्लिकेशन सामान्य रूप से चलें और केवल एक थ्रेड – kamaradclimber

1

कर सकते हैं, लेकिन यह एक खोज के पहले उत्तर के रूप में काटी।

मैं वी.एस. 2015 में निम्नलिखित का उपयोग करें ...

var thread = System.Threading.Thread.CurrentThread; 
if (thread.Name == null) 
      thread.Name = "Main"; 
फिर ब्रेकप्वाइंट में

...

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

यह और अधिक लचीला आप एक कस्टम कक्षा में थ्रेड एम्बेड कर सकते हैं बनाने के लिए।

एफवाईआई: आप एक सशर्त ब्रेकपॉइंट में स्थैतिक चर का उपयोग नहीं कर सकते क्योंकि वे संदर्भ में नहीं हैं। वास्तव में कभी नहीं समझा कि क्यों सांख्यिकी हमेशा संदर्भ में नहीं होती है।

+0

में ब्रेक पॉइंट्स पर रोक दें, आपके उत्तर के लिए धन्यवाद (यहां तक ​​कि देर हो चुकी है) आप थ्रेड नाम के लिए कोड का पहला टुकड़ा कहां जोड़ेंगे? (मैंने कोड में इसे जोड़ने का उल्लेख किया है, मुझे उस थ्रेड को पहले से जानना होगा जिसे मैं अनुसरण करना चाहता हूं) – kamaradclimber

+0

@kamaradclimber। जितनी जल्दी हो सके। आप केवल एक धागा नाम सेट कर सकते हैं या एक अपवाद है। आप डीबग में मैन्युअल रूप से थ्रेड सेट कर सकते हैं। आप यह भी कह सकते हैं कि thread.name == xxx System.Diagnostics.Debugger.Break() – Paulustrious

+0

क्षमा करें .. 5 मिनट का टाइमआउट। @kamaradclimber। जितनी जल्दी हो सके। आप केवल एक धागा नाम सेट कर सकते हैं या एक अपवाद है। आप थ्रेड या मैन्युअल रूप से थ्रेड में मैन्युअल रूप से सेट कर सकते हैं। थ्रेडिंग। थ्रेड.कुरेंट थ्रेड.अम = "xyz"। आप यह भी कह सकते हैं ... अगर (thread.name == xxx) {System.Diagnostics.Debugger.Break();}। यदि आप चाहें तो आप एक ही नाम को एक ही नाम दे सकते हैं। अतीत में मैंने बूल स्टॉप = थ्रेड के साथ कोड जोड़ा है। नाम == "कुछ नाम" और फिर डीबगिंग ब्रेकपॉइंट में आप केवल 'स्टॉप' स्थिति डाल सकते हैं। जीवन आसान बनाता है – Paulustrious

संबंधित मुद्दे