मेरे पास एक ही कोड काम करने वाले 4 थ्रेड्स के साथ एक एप्लिकेशन है। हालांकि, जब मैं कदम रखता हूं तो यह विभिन्न थ्रेड्स के बीच कूदता है। मैं इसे एक थ्रेड पर कैसे लॉक कर सकता हूं ताकि डिबगिंग के लिए अन्य थ्रेड्स को अनदेखा कर दिया जाए?
मेरे पास एक ही कोड काम करने वाले 4 थ्रेड्स के साथ एक एप्लिकेशन है। हालांकि, जब मैं कदम रखता हूं तो यह विभिन्न थ्रेड्स के बीच कूदता है। मैं इसे एक थ्रेड पर कैसे लॉक कर सकता हूं ताकि डिबगिंग के लिए अन्य थ्रेड्स को अनदेखा कर दिया जाए?
जवाबों:
हाँ।
थ्रेड्स विंडो में (डीबग -> विंडोज -> थ्रेड्स) अपने इच्छित धागे पर राइट-क्लिक करें और "स्विच टू थ्रेड" चुनें।
आप उन थ्रेड्स पर "फ्रीज" भी चुन सकते हैं जिन्हें आप चालू रखने के लिए डिबग नहीं करना चाहते हैं। यदि आप उनसे काम करने की अपेक्षा करते हैं, तो उन्हें "पिघलना" मत भूलना।
सिंगल थ्रेड के माध्यम से सिंगल स्टेपिंग ज्यादातर वीएस 2012 में तय की गई है (कुछ कैविटीज़ के साथ आप नीचे मेरे लिंक में देख सकते हैं)। ब्रेकप्वाइंट एक दर्द है।
फ्रीजिंग और विगलन थ्रेड्स सामान्य वर्कअराउंड है, जैसा कि पिछले उत्तरों में बताया गया है, लेकिन यह थकाऊ है, और यह तब लटका सकता है जब आपका थ्रेड जमे हुए दूसरे धागे पर इंतजार करता है। ये आपके हित के धागे में अपना स्थान खोए बिना से उबरना कठिन हो सकता है।
एक अन्य उपयोगी वर्कफ़्लो आपके ब्रेकपॉइंट पर थ्रेड फ़िल्टर लागू करना है, जो कुछ उत्तरों में भी बताया गया है:
एक ब्रेकपॉइंट बनाएं, ब्रेकपॉइंट पर राइट क्लिक करें, फ़िल्टर पर क्लिक करें, और थ्रेडआईडी = 7740 दर्ज करें (थ्रेड्स से आपकी थ्रेड आईडी)।
यह बहुत थकाऊ हो सकता है।
Microsoft के लिए मेरा सुझाव सिंगल स्टेपिंग (और इसके बदलाव) को ठीक करना है, जब तक कि थ्रेड को दूसरे थ्रेड में एक स्पष्ट ब्रेकपॉइंट हिट न किया जाए। उन्हें अपने फ़िल्टर के रूप में वर्तमान थ्रेड आईडी के साथ एक ब्रेकपॉइंट बनाने के लिए एक शॉर्टकट (शायद Ctrl-F9) भी जोड़ना चाहिए। यह दूसरा वर्कफ़्लो बहुत अधिक सुविधाजनक बना देगा।
सुझाव को वोट दें यदि आप सहमत हैं कि यह उपयोगी होगा, या अपने स्वयं के सुझाव जोड़ें:
आप अपने कोड में एक सशर्त ब्रेकपॉइंट भी डाल सकते हैं thread.Id == [someValue]
या Thread.Name == "[Somename]"
ब्रेकपॉइंट की स्थिति में डाल सकते हैं ...
सरल मामलों के लिए बहुत तेज वर्कअराउंड मौजूद है - स्टीव के लिंक में टिप्पणियां देखें।
डीबगर केवल उस थ्रेड पर एक चरण को पूरा करेगा, जिसमें से कदम की उत्पत्ति हुई थी। इसलिए यदि आप एक ब्रेकपॉइंट मारते हैं, तो इसे अक्षम करें, और फिर कदम शुरू करें आपको एक अलग धागे पर नहीं रोकना चाहिए। यदि आपके आवेदन में अन्य विराम बिंदु हैं और एक और धागा एक हिट करता है, तो आप वर्णित रूप में मिश्रित थ्रेड स्थिति में डीबगिंग करेंगे
इसलिए मेरे मामले में एक बार जब विभिन्न थ्रेड्स ने मेरे ब्रेकपॉइंट को मारना शुरू कर दिया, तो मैंने कुछ समय तक जारी रखा जब तक कि मुझे उस कॉल की पहचान नहीं हो गई, जिसकी मैं तलाश कर रहा था - फिर ब्रेकपॉइंट हटा दिया और शेष कोड के माध्यम से एक ही धागे पर शेष रहते हुए बिना किसी बाधा के आगे बढ़ गया। उनमें से बचे हुए।
यह स्पष्ट रूप से एक समस्या बन जाती है यदि आपके पास कई ब्रेकप्वाइंट हैं जिन्हें आप रखना चाहते हैं, आदि - लेकिन फिर से सरल मामलों के लिए यह करना बहुत आसान है।
यह दृश्य स्टूडियो 2008 SP1 में एक बहुत ही समान समस्या जैसा दिखता है। यह एक पोस्ट-एसपी हॉटफिक्स के साथ तय किया गया था। लेकिन अन्य प्रमाण हैं कि हॉटफ़िक्स को कोड बेस में शामिल नहीं किया गया था, यह फीडबैक आइटम भी एक समस्या थी। यह नहीं है कि हॉटफिक्स के लिए असामान्य वापस एकीकृत नहीं मिलता है।
कोई प्रतिक्रिया आइटम नहीं है जो आपकी समस्या का सटीक वर्णन करता है, कम से कम जो मुझे मिल सकता है। मैं आपको एक फाइल करने की सलाह दूंगा। इस तरह से कीड़े के साथ सामान्य परेशानी को देखते हुए, मैं दृढ़ता से सुझाव दूंगा कि आप एक प्रजनन परियोजना को शामिल करें जो इस समस्या को प्रदर्शित करता है कि इस मुद्दे को कैसे पुन: उत्पन्न करें।
आपके समस्या के लिए एक प्रकार का समाधान है, आप डिबग + विंडोज + थ्रेड्स में जा सकते हैं, उन थ्रेड पर राइट-क्लिक करें जिन्हें आप डीबग नहीं करना चाहते हैं और फ्रीज का चयन करें। बाद में उन्हें पिघलना न भूलें।
इन बग्स को फिर से विज़ुअल स्टूडियो 2010 सर्विस पैक 1 में तय किया गया।
मैं विज़ुअल स्टूडियो प्रोफेशनल 2017 का उपयोग कर रहा हूं, और मैं थ्रेड विंडो का उपयोग चुनिंदा फ्रीज और थ्रेड थ्रेड्स के लिए करता हूं। आमतौर पर मेरे पास एक ही कोड के कई थ्रेड होते हैं और मैं केवल उन्हें फ्रीज करना चाहता हूं, दूसरों को नहीं। मैं वास्तव में एमएस थ्रेड्स विंडो को पसंद करता हूं क्योंकि मैं थ्रेड्स के सबसेट को फ्रीज करने के लिए चुन सकता हूं। मैं थ्रेड्स को नाम से समूहीकृत करता हूं और फिर उसी कोड को चलाने वाले सभी को फ्रीज कर सकता हूं क्योंकि मैं शेष थ्रेड्स को चलाने के दौरान डिबगिंग कर रहा हूं। मैंने इरविन मेयर एक्सटेंशन का उपयोग करने की कोशिश की, और इसने बहुत अच्छी तरह से काम किया, लेकिन यह मेरे द्वारा चलाए जा रहे को छोड़कर सभी थ्रेड्स को जमा देता है, और मैं कभी-कभी ऐसी स्थिति में आ जाता हूं जब डिबगिंग ब्रेकपॉइंट को हिट नहीं करता है जो मुझे लगता है कि यह होना चाहिए, तब अन्य थ्रेड बंद कर दिए गए हैं और एप्लिकेशन रुक गया है। पॉज़ बटन को हिट करना, और थ्रेड विंडो में थ्रेडिंग को हल करना उस समस्या को हल करता है।
5. चारों ओर कूद के बिना एक ही धागे के माध्यम से कदम
आप मल्टीथ्रेड कोड को कितनी बार डीबग कर रहे हैं, जब आप अपना पहला ब्रेकपॉइंट मारते हैं, तो एक कदम उठाते हैं, और फिर अचानक आपको एक और धागे पर पीले तीर के साथ रोक दिया जाता है? अनपेक्षित व्यवहार अभी भी सेट होने और परिणामी हिट होने के कारण आता है। डिफ़ॉल्ट रूप से, डीबगर किसी भी समय हिट होने पर ब्रेकपॉइंट पर रुक जाएगा। इसका मतलब यह है कि जब आप एक कदम उठाते हैं, तो सभी थ्रेड्स को चलाने की अनुमति दी जाती है, और आपके चलने वाले थ्रेड में से एक इस ब्रेकपॉइंट को आपके वर्तमान थ्रेड पर कदम पूरा होने से पहले मार देता है। अगली बार जब आप इस स्थिति में आएँ तो यह कोशिश करें:
- डिबगर स्विच करने के लिए नए थ्रेड द्वारा हिट किए गए ब्रेकपॉइंट को अक्षम या हटाएं।
- प्रेस जारी (F5)
- इस बात पर ध्यान दें कि उस पहले धागे पर आपका पहला प्रारंभिक कदम कैसे पूरा हुआ और अब सक्रिय डिबगिंग संदर्भ है।
- चूँकि आपके ब्रेकप्वाइंट हटा दिए गए हैं या अक्षम हो गए हैं, आप बिना किसी रुकावट के उस एकल धागे पर कदम रख सकते हैं।