बहु-थ्रेडेड दौड़ की स्थितियों का परीक्षण करना


54

इस उत्तर के लिए टिप्पणियों को पढ़ना , विशेष रूप से:

सिर्फ इसलिए कि आप एक परीक्षा नहीं लिख सकते इसका मतलब यह नहीं है कि यह टूटा नहीं है। अपरिभाषित व्यवहार जो आमतौर पर उम्मीद के मुताबिक काम करने के लिए होता है (C और C ++ उस से भरे हुए हैं), दौड़ की स्थिति, कमजोर मेमोरी मॉडल के कारण संभावित पुनरावृत्ति ... - CodesInChaos 7 घंटे पहले

@CodesInChaos अगर यह फिर से नहीं किया जा सकता है तो 'फिक्स' कैंट के लिए लिखे गए कोड का परीक्षण किया जाना चाहिए। और अप्रयुक्त कोड को लाइव में डालना मेरी राय में एक बदतर अपराध है - 5 घंटे पहले RhysW

... मुझे आश्चर्य है कि क्या कोई अच्छा सामान्य तरीके हैं जो लगातार परीक्षण के मामले में दौड़ की स्थिति के कारण उत्पादन समस्याओं में लगातार होने वाले ट्रिगर करने के लिए हैं।


1
(विधानसभा) निर्देश के माध्यम से दोनों सिरों पर निर्देश
शाफ़्ट सनकी

1
स्टेटिक विश्लेषण अक्सर संभावित यूबी दिखा सकता है, यह स्पष्ट नहीं है कि क्या इसे परीक्षण के रूप में गिना जाता है
जेके।

पूछने के लिए क्षमा करें, लेकिन 'UB' का क्या अर्थ है?
डग

2
अच्छा सवाल है, मैं इस के लिए संभावित समाधान देखने में दिलचस्प होगा।
RhysW

1
@ डड अपरिभाषित व्यवहार, जिसमें शामिल हो सकते हैं, लेकिन दौड़ की स्थिति तक सीमित नहीं है
jk।

जवाबों:


85

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

नहीं।

परीक्षण में दौड़ की स्थिति को ट्रिगर करने का कोई अच्छा सामान्य तरीका नहीं है।

आपकी एकमात्र आशा है कि उन्हें आपके सिस्टम से पूरी तरह से डिज़ाइन किया जाए।

जब और यदि आप पाते हैं कि किसी और ने एक को भर दिया है, तो आपको उसे एक एंथिल को दांव पर लगाना चाहिए, और फिर इसे खत्म करने के लिए नया स्वरूप देना चाहिए। आपके सिस्टम से बाहर उसके नकली पेस (उच्चारण f *** अप) को डिज़ाइन करने के बाद, आप उसे चींटियों से मुक्त कर सकते हैं। (यदि चींटियों ने पहले ही उसे खा लिया है, केवल हड्डियों को छोड़कर, यह कहते हुए एक साइन अप करें "यह वही होता है जो उन लोगों के साथ होता है जो एक्सवाईजेड परियोजना में दौड़ की स्थिति डालते हैं!" और वहां से चले गए।)


22
मैं पूरी तरह से सहमत। दूसरे शब्दों में, यह बहुत कुछ मजाक की तरह है - रोगी: "डॉक्टर, यह दर्द होता है जब मैं ऐसा करता हूं ..." डॉक्टर: "फिर इसे करना बंद करो!"
मार्क रुशकॉफ़

अच्छा जवाब। यदि कोई अन-परीक्षण योग्य समस्या का कारण बनता है, तो इसके साथ शुरू करने के लिए चारों ओर काम करने की कोशिश करें, समस्या से पूरी तरह से बचें!
RhysW

मेरा एकमात्र सवाल है: मुझे एक एंथिल का कितना बड़ा उपयोग करना चाहिए? (+1 बीटीडब्ल्यू)।
पीटर के।

15
अशुद्ध पेस के सही उच्चारण के लिए +1 । (और शेष उत्तर।)
ब्लरफेल

1
@PeterK।, यह सॉफ्टवेयर विकास में उन कुछ मामलों में से एक है, मॉनिटर, रैम और डिस्क ड्राइव के साथ, जहां आईएस बेहतर है।
जॉन आर। स्ट्रोह्म

16

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

यहाँ एक वीडियो है जो इसे उपयोग में दिखा रहा है।


5
जो प्रभावशाली दिखता है; मुझे कुछ बिंदु पर इसे आज़माने के लिए समय निकालना होगा।
दान नीली

16

इन प्रकार की समस्याओं के लिए मुझे जो सबसे अच्छा उपकरण पता है, वह है हेलग्रिंड नामक वैलेग्रिंड का विस्तार ।

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

इंटेल एक बहुत ही समान उपकरण बेचता है जिसे इंटेल इंस्पेक्टर कहा जाता है ।

ये उपकरण शानदार परिणाम देते हैं लेकिन विश्लेषण के दौरान आपका कार्यक्रम काफी धीमा हो जाएगा।


1
Valgrind अभी भी एक * केवल उपकरण nix है?
डैन नीली

1
हां, लिनक्स, मैकओएसएक्स, एंड्रॉइड और कुछ बीएसडी: valgrind.org/info/platforms.html
जूलियन

1
ThreadSanitizer एक समान उपकरण है। यह हेलग्रिंड की तुलना में अलग तरह से काम करता है, जो इसे बहुत तेज़ होने का लाभ देता है, लेकिन टूलचिन में एकीकरण की आवश्यकता होती है।
सेबेस्टियन रेडल

7

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

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


2
मैंने इंजेक्शन के रिपोजिटरी का उपयोग करने से पहले ऐसा ही किया है जो मुझे चाहिए कि इंटरलेव को मजबूर करने के लिए विशिष्ट आदेशों में कॉल करने वाले थ्रेड्स को सोता है। ऐसा करने वाले लिखित कोड होने के बाद, मैं +1 @ जॉन के उत्तर के लिए इच्छुक हूं। गंभीरता से, यह सामान सही ढंग से काम करने के लिए बहुत दर्दनाक है, और फिर भी केवल सबसे अच्छा अनुमान की गारंटी देता है क्योंकि विभिन्न परिणामों के साथ थोड़ा अलग इंटरलेव्स हो सकता है; बेहतर तरीका यह है कि स्थिर विश्लेषण और या किसी भी और सभी साझा राज्य के लिए कोड की सावधानीपूर्वक कंघी के माध्यम से सभी संभावित दौड़ की स्थितियों को समाप्त किया जाए
जिमी हॉफ

6

यह सुनिश्चित करने का कोई तरीका नहीं है कि विभिन्न प्रकार के अपरिभाषित व्यवहार (विशेष रूप से दौड़ की स्थिति में) मौजूद नहीं हैं।

हालांकि, ऐसे कई उपकरण हैं जो इस तरह की स्थितियों की एक अच्छी संख्या दिखाते हैं। आप यह साबित करने में सक्षम हो सकते हैं कि इस तरह के उपकरणों के साथ एक समस्या वर्तमान में मौजूद है, भले ही आप यह साबित नहीं कर सकते कि आपका फिक्स वैध है।

इस उद्देश्य के लिए कुछ दिलचस्प उपकरण:

Valgrind एक मेमोरी चेकर है। यह मेमोरी लीक, अनइंस्टॉल की गई मेमोरी की रीडिंग, लटकने वाले पॉइंटर्स का उपयोग और आउट-ऑफ-बाउंड एक्सेस का पता लगाता है।

हेलग्रिंड एक थ्रेड सेफ्टी चेकर है। यह दौड़ की स्थिति का पता लगाता है।

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

UBSan एक अपरिभाषित व्यवहार चेकर है। यह C और C ++ के अपरिभाषित व्यवहार के विभिन्न मामलों का पता लगाता है, जैसे पूर्णांक ओवरफ्लो, आउट-ऑफ-रेंज शिफ्ट और इसी तरह के सामान।

MSan एक मेमोरी चेकर है। इसका वैलेग्रिंड के समान लक्ष्य है।

TSan एक थ्रेड सुरक्षा चेकर है। हेलग्रिंड के समान इसके लक्ष्य हैं।

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

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


1

ऐसा लगता है कि यहां अधिकांश उत्तर इस प्रश्न को भूल जाते हैं कि "मैं स्वचालित रूप से दौड़ की स्थिति का कैसे पता लगा सकता हूं?" जब प्रश्न वास्तव में है "जब मैं उन्हें खोजता हूं तो मैं परीक्षण में दौड़ की स्थितियों को कैसे पुन: पेश करता हूं?"

इसे करने का तरीका आपके कोड में सिंक्रनाइज़ेशन को प्रस्तुत करना है जो केवल परीक्षण के लिए उपयोग किया जाता है। उदाहरण के लिए, यदि इवेंट A, इवेंट A और इवेंट B के बीच में होता है, तो एक दौड़ की स्थिति होती है, तो अपने आवेदन के परीक्षण के लिए, कुछ कोड लिखें जो Event A के होने के बाद इवेंट X के होने की प्रतीक्षा करता है। आपको यह बताने के लिए अपने परीक्षणों के लिए अपने आवेदन पर बात करने के लिए किसी तरह की आवश्यकता होगी ("इस बात का परीक्षण कर रहा हूं, इसलिए इस स्थान पर इस घटना की प्रतीक्षा करें")।

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

यहाँ उत्तर इस प्रकार की बात को अजगर के संदर्भ में विस्तार से बताता है: https://stackoverflow.com/questions/19602535/how-can-i-reproduce-the-race-conditions-in-this-python-code-code मज़बूती से

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