2010-07-05 13 views
6

मैं सोच रहा था कि क्या कोई बहुप्रचारित अनुप्रयोगों के लिए डिबगिंग तकनीकों के अच्छे सर्वेक्षण के बारे में जानता है। आदर्श रूप से, मैं एक केस-आधारित विश्लेषण की तलाश में हूं: डेडलॉक्स, भुखमरी, भ्रष्ट साझा राज्य, ...मल्टीथ्रेड डीबगिंग तकनीक

नेट विशिष्ट, या सामान्य।

+6

वहां बहुत सारे अच्छे टूल हैं, लेकिन कोड के माध्यम से पढ़ने के सरल दृष्टिकोण को नजरअंदाज न करें। मैं वर्षों से बहुप्रचारित डीबगिंग कर रहा हूं, और यह सबसे प्रभावी तरीकों में से एक है। –

+0

सच है। यह बहुत अच्छी तरह से काम करता है। मैं उपकरण की तुलना में तकनीकों (जैसे 'इस तरह) पर और अधिक देख रहा हूं। – Mau

+0

+1 @ स्टीफन वास्तव में बहुत सच है। –

उत्तर

11

मैं एक लेख या पुस्तक है कि संबोधित करते हैं आप जो खोज रहे हैं के बारे में पता नहीं कर रहा हूँ, इसलिए यहाँ मेरे Windows पर बहु-क्रम डीबगिंग के 12 साल से "सबक सीख लिया" (दोनों अप्रबंधित और प्रबंधित) है।

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

गतिरोध और भ्रष्ट साझा राज्य

दस्तावेज़ lock hierarchies (दोनों आदेश और क्या साझा राज्य वे रक्षा), और सुनिश्चित करें कि वे लगातार कर रहे हैं। यह सबसे गतिरोध समस्याओं और भ्रष्ट साझा राज्य की समस्याओं को हल करती है।

(नोट: "लॉक पदानुक्रम" के लिए उपरोक्त लिंक हर्ब सटर द्वारा डॉ डॉब्स लेख को संदर्भित करता है; उन्होंने Effective Concurrency लेखों की एक पूरी श्रृंखला लिखी है जो मैं अत्यधिक अनुशंसा करता हूं)।

पर गतिरोध

उपयोग RAII for all synchronizationअधिक। यह सुनिश्चित करता है कि ताले अपवादों के सामने जारी किए जाते हैं। कोशिश करने के लिए "लॉक" कथन पसंद करें।

(ध्यान दें कि .NET में RAII IDisposable पर निर्भर करता है, Finalize नहीं, और मानता है कि क्लाइंट कोड सही ढंग से using ब्लॉक का उपयोग करेगा)।

भुखमरी

धागा प्राथमिकताओं में से किसी भी संशोधन निकालें।/ओ बाध्य (यूआई धागा सहित) यह सूत्र है कि मैं कर रहे हैं के लिए सबसे अधिक काम के साथ धागा एक निम्न प्राथमिकता करने के लिए उच्च प्राथमिकता देते हैं, और देने के लिए सबसे अच्छा है: सही प्राथमिकता वास्तव में एक सा जवाबी सहज है।चूंकि विंडोज स्वचालित रूप से ऐसा करता है (Windows Internals देखें), वास्तव में कोड शामिल होने का कोई कारण नहीं है।

जनरल में

निकालें सभी ताला मुक्त कोड है कि घर में लिखा गया था। इसमें लगभग निश्चित रूप से सूक्ष्म बग होते हैं। इसे .NET 4 lock-free collections और synchronization objects के साथ बदलें, या लॉक-आधारित होने के लिए कोड बदलें।

सिंक्रनाइज़ेशन के लिए उच्च स्तरीय अवधारणाओं का उपयोग करें। Task Parallel Library और unified cancellation .NET 4 निकालने में काफी किसी भी ManualResetEvent, Monitor, Semaphore के प्रत्यक्ष उपयोग के लिए की जरूरत है, आदि

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

एक और तकनीक है जिसे मैंने किसी भी वर्ग के लिए उपयोगी पाया है जिसमें विभिन्न धागे द्वारा बुलाए जाने वाले तरीके हैं: दस्तावेज़ जो विधियों पर चलते हैं। आमतौर पर, इसे विधि के शीर्ष पर एक टिप्पणी के रूप में जोड़ा जाता है। सुनिश्चित करें कि प्रत्येक विधि केवल ज्ञात धागे संदर्भ में चलती है (उदाहरण के लिए, "यूआई थ्रेड पर" या "थ्रेडपूल थ्रेड पर" या "समर्पित पृष्ठभूमि थ्रेड पर")। जब तक आप एक सिंक्रनाइज़ेशन क्लास नहीं लिख रहे हैं (और यदि आप एक सिंक्रनाइज़ेशन क्लास लिख रहे हैं, तो किसी भी विधि को "किसी भी थ्रेड पर" नहीं कहना चाहिए, अगर आप वास्तव में ऐसा कर रहे हैं तो खुद से पूछें)।

अंत में, अपने धागे का नाम दें। वीएस डीबगर का उपयोग करते समय यह आसानी से उन्हें अलग करने में मदद करता है। .NET संपत्ति के माध्यम से इसका समर्थन करता है।

6

आप जो भी मांग रहे हैं, लेकिन शायद आपको CHESS दिलचस्प लगता है।

+0

दिलचस्प, धन्यवाद। – Mau

+0

+1 ... उत्कृष्टता के लिए। इस तरह की कोई चीज़ मौजूद नहीं थी! विवा चेस! –

+0

यह गंभीरता से भयानक है। –

0

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

  1. पॉज़िक्स pthreads API के दुरुपयोग।
  2. लॉक ऑर्डरिंग समस्याओं से उत्पन्न संभावित डेडलॉक्स।
  3. डेटा दौड़ - पर्याप्त लॉकिंग या सिंक्रनाइज़ेशन के बिना स्मृति तक पहुंच।

http://valgrind.org/docs/manual/hg-manual.html

जाहिर प्रणाली कार्यक्रमों के लिए केवल linux उपकरण, C/C++। कोई जावा या .NET नहीं।

0

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

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

const int maxMessages = 0x100; 
const int indexMask = maxMessages-1; 
string[] messages = new string[maxMessages]; 
int messagesIndex = -1; 

public void Trace(string message) { 
    int thisIndex = Interlocked.Increment(ref messagesIndex) & indexMask; 
    messages[thisIndex] = message; 
} 

जो भी धागा और समय के बारे में जानकारी और आउटपुट एकत्र करता है इस दृष्टिकोण के लिए एक अधिक विस्तृत विवरण ट्रेस अच्छी तरह से है: कोडप्रोजेक्ट: रीयल टाइम में मल्टीथ्रेड कोड को डिबग करना 1

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