2010-01-14 15 views
15

मैं मोनो के साथ चलने वाले फांसी वाले एप्लिकेशन में धागे (स्टैकट्रैस) कैसे दिखा सकता हूं?मैं मोनो के साथ थ्रेड डंप कैसे बना सकता हूं?

मुझे पता है कि मैं इसे प्रबंधित स्टैक एक्सप्लोरर (एमएसई) के साथ .NET में कर सकता हूं। क्योंकि एप्लिकेशन केवल मोनो के साथ लटका है कि मुझे इसे मोनो के साथ करने की ज़रूरत है।

या कोई अन्य विचार है कि मैं लटकने की जगह कैसे पा सकता हूं?

उत्तर

16

मान लीजिए कि आप लिनक्स/यूनिक्स पर हैं, विंडोज नहीं, अपने प्रोग्राम में एक सिग्क्विट सिग्नल भेजें। यह

kill -QUIT $PID 

जहां $ PID आपके प्रोग्राम का ढक्कन हो सकता है। फिर मोनो सभी थ्रेडों के स्टैक निशान को स्टडआउट करने के लिए डंप करेगा। ध्यान दें कि यद्यपि प्रक्रिया इसके बाद चलती रहती है, आपको उम्मीद नहीं करनी चाहिए कि यह उपयोग योग्य/स्थिर रहे।

कुछ पृष्ठभूमि के लिए http://en.wikipedia.org/wiki/SIGQUIT देखें।

0

जीडीबी का उपयोग करके एक प्रबंधित स्टैक ट्रेस को तुरंत पकड़ना भी संभव है। gdb निष्पादित करें; यदि आप अपने उपयोगकर्ता के स्वामित्व वाली प्रक्रिया को रूट या डिबग नहीं कर रहे हैं तो सूडो का उपयोग करें।

इस स्क्रिप्ट जो मैं mono-project.org पर debugging Mono पेज से मिला निष्पादित करें:

handle SIGXCPU SIG33 SIG35 SIGPWR nostop noprint 

define mono_stack 
set $mono_thread = mono_thread_current() 
if ($mono_thread == 0x00) 
    printf "No mono thread associated with this thread\n" 
else 
    set $ucp = malloc (sizeof (ucontext_t)) 
    call (void) getcontext ($ucp) 
    call (void) mono_print_thread_dump ($ucp) 
    call (void) free ($ucp) 
end 
end 

आप आप अपने ~/.gdbinit में इन आदेशों ड्रॉप कर सकते हैं पसंद करते हैं तो आप को कॉपी और पेस्ट सभी की जरूरत नहीं है समय।

अब आप अपने पीआईडी ​​को देते हैं:

attach 12345 

ध्यान दें कि पूरी प्रक्रिया अभी रुका हुआ है अगर तुम उत्पादन में इस कर रहे हैं यह स्क्रिप्ट सलाह दी जाती है इस तो यह जितनी जल्दी संभव के रूप में है।

अपना स्टैक ट्रेस प्राप्त करने के लिए, ऊपर परिभाषित अनुसार mono_stack निष्पादित करें। ध्यान दें कि आप जीडीबी में आउटपुट नहीं देख पाएंगे लेकिन स्टडआउट में। यदि आप अपस्टार्ट के साथ अपनी प्रक्रिया चलाते हैं तो आप इसे console log पर /var/log/upstart पर लॉग इन करने के लिए अपस्टार्ट जॉब को संपादित कर सकते हैं।

हालांकि आप अपने मुख्य धागे की तुलना में किसी अन्य धागे में रुचि ले सकते हैं। ऐसा करने के लिए, थ्रेड # 2 पर स्विच करने के लिए अपनी थ्रेड सूची और thread 2 प्राप्त करने के लिए info threads निष्पादित करें। थ्रेड डीबगिंग के बारे में अधिक जानकारी के लिए, जीडीबी दस्तावेज़ों में debugging programs with multiple threads देखें।

एक बार पूरा हो जाने के बाद, quit निष्पादित करें, और आपका प्रोग्राम काम करना जारी रखेगा।

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