जीडीबी का उपयोग करके एक प्रबंधित स्टैक ट्रेस को तुरंत पकड़ना भी संभव है। 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
निष्पादित करें, और आपका प्रोग्राम काम करना जारी रखेगा।
स्रोत
2016-08-31 12:31:22