बहुप्रचारित कार्यक्रमों का विश्लेषण करना

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

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


अद्यतन करें

मैं अब तक प्राप्त प्रतिक्रियाओं की सराहना करता हूं, लेकिन मैं सलाह की तुलना में कुछ अधिक परिष्कृत या व्यवस्थित करने की उम्मीद कर रहा था, जो अनिवार्य रूप से "लॉग संदेश जोड़ें, पता लगाएं कि क्या हो रहा है, और इसे ठीक करें।" एकल-थ्रेडेड प्रोग्राम्स में नियंत्रण-प्रवाह का विश्लेषण और दस्तावेज़ीकरण करने के लिए वहां बहुत सारे टूल हैं; क्या बहु-थ्रेडेड कार्यक्रमों के लिए कुछ भी उपलब्ध नहीं है?


See also Debugging multithreaded applications

0
ro fr bn

7 उत्तर

Log4net या इसी तरह के टूल का उपयोग करने के साथ ध्यान में रखना एक बात यह है कि वे एप्लिकेशन के समय को बदलते हैं और अक्सर अंतर्निहित दौड़ की स्थिति को छुपा सकते हैं। हमारे पास डीबग करने और लॉगिंग शुरू करने के लिए कुछ खराब लिखित कोड थे और इसने वास्तव में दौड़ की स्थिति और डेडलॉक्स को हटा दिया (या उनकी आवृत्ति को बहुत कम कर दिया)।

0
जोड़ा

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

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

यदि समेकन पर प्रतिकूल प्रभाव नहीं पड़ेगा तो देखें कि क्या आप कई ताले को एक साथ जोड़ सकते हैं। उदाहरण के लिए, यदि म्यूटेक्स ए और बी प्रतीत होता है कि उनके पास डेडलॉक्स हो सकते हैं और ऑर्डरिंग योजना आसानी से नहीं की जाती है, तो उन्हें शुरुआत में एक लॉक में संयोजित करें।

यह आसान नहीं होगा लेकिन समस्या का एक संभाल पाने के लिए मैं सहमति के खर्च पर कोड को सरल बनाने के लिए हूं।

0
जोड़ा

इंटेल के VTune की एक प्रति में निवेश करें और इसके धागे प्रोफाइलिंग उपकरण। यह आपको थ्रेड व्यवहार के सिस्टम और स्रोत स्तर दोनों दृश्य प्रदान करेगा। यह निश्चित रूप से आपके लिए चीज को स्वत: दस्तावेज नहीं करने जा रहा है, लेकिन कम से कम परिस्थितियों में क्या हो रहा है यह देखने में वास्तविक सहायता होनी चाहिए।

मुझे लगता है कि एक परीक्षण संस्करण है जिसे आप डाउनलोड कर सकते हैं, इसलिए इसे जाने के लायक हो सकते हैं। मैंने केवल विंडोज संस्करण का उपयोग किया है, लेकिन वीट्यून वेबपेज को देखते हुए इसमें एक लिनक्स संस्करण भी है।

0
जोड़ा
मैंने एक स्पिन के लिए वीट्यून लिया ... और मुझे लगता है कि मैं ऐप्पल के शार्क प्रोफाइलर को बेहतर पसंद करता हूं क्योंकि मुझे अंतर्ज्ञानी और सीधे आगे के लिए इंटरफ़ेस और आउटपुट मिलता है। मेरे 2 सेंट
जोड़ा लेखक paxos1977, स्रोत

क्या यूएमएल आपकी मदद नहीं कर सकता?

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

यह "डेटा ऑब्जेक्ट्स" भी साझा करेगा जो साझा किए गए हैं और ऑब्जेक्ट्स थ्रेड-विशिष्ट हैं।

यदि आप एक बड़े वर्ग के आरेख को खींचते हैं और सभी "डेटा ऑब्जेक्ट्स" को हटाते हैं, तो आपको क्लाउड के रूप में आरेख को लेआउट करने में सक्षम होना चाहिए, प्रत्येक बादल थ्रेड हो रहा है - या धागे का समूह, जब तक कि कोड बेस का युग्मन और संयोजन न हो भयंकर।

यह आपको केवल पहेली का एक हिस्सा देगा, लेकिन यह सहायक हो सकता है; मुझे उम्मीद है कि आपका कोडबेस बहुत गंदा या बहुत "प्रक्रियात्मक" नहीं है, इस मामले में ...

0
जोड़ा

जावा में, आपके पास कुछ प्रकार के असंगत सिंक्रनाइज़ेशन, या कवरिटी, जेपीरोब, ऑप्टिमाइज़ इत्यादि जैसी कंपनियों के कई गतिशील थ्रेड विश्लेषक खोजने के लिए FindBugs (स्थिर बाइटकोड विश्लेषण के लिए) जैसे विकल्प हैं।

0
जोड़ा

स्वचालित उपकरणों के लिए यह वास्तव में एक कठिन समस्या है। आप अपने कोड मॉडल जांच में देखना चाहेंगे। जादुई परिणामों की अपेक्षा न करें: मॉडल चेकर्स कोड की मात्रा और उन धागे की संख्या में बहुत सीमित हैं जिन्हें वे प्रभावी रूप से जांच सकते हैं।

एक टूल जो आपके लिए काम कर सकता है वह है CHESS (हालांकि दुर्भाग्य से विंडोज़ केवल) है। BLAST एक और काफी शक्तिशाली उपकरण है, लेकिन इसका उपयोग करना बहुत मुश्किल है और हो सकता है सी ++। विकिपीडिया में StEAM भी सूचीबद्ध है, जिसे मैंने पहले नहीं सुना है, लेकिन लगता है जैसे यह आपके लिए काम कर सकता है:

स्टीम सी ++ के लिए एक मॉडल चेकर है। यह डेडलॉक्स, सेगमेंटेशन गलतियों, रेंज वैरिएबल से बाहर और गैर-टर्मिनिंग लूप का पता लगाता है।

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

0
जोड़ा

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

0
जोड़ा
System.Diagnostics.Debug/Trace के संयोजन के साथ Sysinternal के मुफ्त डीबग व्यू प्रोग्राम का उपयोग करें, यह आपके एप्लिकेशन से डीबग जानकारी प्राप्त करने का एक शानदार तरीका है, और यह विजुअल स्टूडियो की आउटपुट विंडो की तुलना में बहुत अच्छा है।
जोड़ा लेखक Rob Ringham, स्रोत
मैं बस इतना कहता हूं: [TestFixtureSetUp] सार्वजनिक शून्य ConfLog4Net() {log4net.Config.BasicConfigurator.Configure (नया TraceAppender {लेआउट = नया पैटर्न Layout ("[% t]% m% newline"), थ्रेसहोल्ड = Level.Info}); }
जोड़ा लेखक Henrik, स्रोत