2012-05-01 17 views
7

मैं सिंक्रनाइज़ेशन ऑपरेशंस रिकॉर्ड करना चाहता हूं, जैसे लॉक, सेम्पहाहोर्स, मल्टीथ्रेडेड एप्लिकेशन की बाधाएं, ताकि मैं डिबगिंग के उद्देश्य के लिए बाद में रिकॉर्ड किए गए एप्लिकेशन को फिर से चला सकूं।मैं एक बहुप्रचारित एप्लिकेशन को कैसे चला सकता हूं?

रास्ते पर अपना खुद का लॉक, सेमफैफोर, हालत चर आदि प्रदान करना है .. कार्य जो लॉगिंग भी करते हैं, लेकिन मुझे लगता है कि यह एक ओवरकिल है, क्योंकि नीचे कुछ सामान्य सिंक्रनाइज़ेशन ऑपरेशंस का उपयोग करना चाहिए।

तो मेरा सवाल यह है कि सिंक्रनाइज़ेशन ऑपरेशंस मुझे लॉग इन करना चाहिए ताकि मुझे अपने कार्यक्रम में न्यूनतम संशोधन की आवश्यकता हो। दूसरे शब्दों में, ग्लिब और फ़ंक्शन में कौन से फ़ंक्शंस या मैक्रोज़ हैं, जिन पर इन सभी सिंक्रनाइज़ेशन ऑपरेशन बनाए गए हैं? ताकि मैं केवल लॉगिंग और रीप्लेइंग के लिए उनको संशोधित कर सकूं।

+0

सभी सिंक्रनाइज़ेशन ऑपरेशंस को रिकॉर्ड करने से आप "रिकॉर्ड किए गए एप्लिकेशन को फिर से चलाने" की अनुमति दे सकते हैं? सिंक्रनाइज़ेशन ऑपरेशंस के क्रम की तुलना में प्रोग्राम के लिए बहुत कुछ है, खासकर यदि अनुपलब्ध सिंक्रनाइज़ेशन के कारण रेस-स्थितियां हैं (जो कि समस्या का भी प्रकार है जिसके लिए मुझे लगता है कि आप डिबगिंग सहायता चाहते हैं)। –

+0

इस पल के लिए, दौड़ की स्थिति के बारे में भूल जाओ। मुझे पता है कि वे भी महत्वपूर्ण हैं। – pythonic

+0

['स्ट्रेस (1)'] (http://linux.die.net/man/1/strace) उपयोगी हो सकता है, लेकिन यह सिंक्रनाइज़ेशन ऑपरेशंस को नहीं पकड़ पाएगा जो पूरी तरह से उपयोगकर्ता स्पेस में कर्नेल में संक्रमण किए बिना होता है, जैसे uncontested mutex ताले के रूप में। –

उत्तर

1

सबसे अच्छा मैं के 'रिकॉर्ड' मोड में gdb के साथ डीबग कर रहा है लगता है कर सकते हैं:

इस पेज के अनुसार: GDB Process Record सूत्रण समर्थन किया जा रहा है, लेकिन यह पूरा नहीं हो सकता है अभी तक।


कम सख्ती से अपने सवाल का जवाब, मैं सुझाव दे सकते हैं

अन्य प्लेटफार्मों पर, कई अन्य सूत्रण चेकर्स मौजूद हैं, लेकिन मैं बहुत नहीं मिला है उनके साथ अनुभव करें।

1

आपके मामले में, लिनक्स पर "लॉगिंग" सिस्टम कॉल की एक प्रभावी विधि LD_PRELOAD चाल का उपयोग करने के लिए हो सकती है, और कॉल के उपयोग को लॉग इन करने वाले कॉल के अपने संस्करणों के साथ वास्तविक सिस्टम कॉल से अधिक सवारी कर सकती है और फिर वास्तविक सिस्टम कॉल के लिए आगे बढ़ें।

here in Linux Journal एक और व्यापक उदाहरण दिया गया है।

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

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

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