2013-04-02 7 views
12

के पोस्ट-मॉर्टम डिबगिंग मेरे पास एक बड़ा प्रोग्राम है, जो सी # में लिखा गया है और मोनो का उपयोग करके लिनक्स सिस्टम पर चल रहा है, जो कभी-कभी क्रैश होता है और mono.bin प्रक्रिया को कोर डंप करने का कारण बनता है।मोनो एओटी-संकलित प्रोग्राम

मैंने कुछ कोर डंप फ़ाइलों पर gdb चलाया, लेकिन यह बहुत उपयोगी नहीं था क्योंकि बैकट्रैस में सी # कार्यों के नाम नहीं हैं। this discussion I found के अनुसार:

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

तो, मैंने किया। मैं अपने सभी सी # डीएलएल और EXE फ़ाइलों को एओटी संकलित किया। --aot=write-symbols विकल्प का उपयोग करना। मेरे प्रोग्राम के एक परीक्षण संस्करण के लिए crashes on purpose ताकि मैं जांच कर सकूं कि इससे बैकट्रैक अधिक उपयोगी हो जाता है या नहीं। और अब तक, यह नहीं है। मुख्य थ्रेड से पश्व-अनुरेखन लगता है:

#0 0xb7fc8402 in __kernel_vsyscall() 
#1 0x00556df0 in raise() from /lib/libc.so.6 
#2 0x00558701 in abort() from /lib/libc.so.6 
#3 0x080e59b5 in ??() 

एक और धागा है:

#0 0xb7fc8402 in __kernel_vsyscall() 
#1 0x005f6753 in poll() from /lib/libc.so.6 
#2 0xb6f735a7 in Mono_Unix_UnixSignal_WaitAny() 
    from /opt/novell/mono/lib/libMonoPosixHelper.so 
#3 0xb5416578 in ??() 

और अन्य थ्रेड निष्क्रिय होता हुआ प्रतीत (में nanosleep, pthread_cond_timedwait, pthread_cond_wait, sem_timedwait, या sem_wait)। लेकिन सभी बैकट्रैस की बात आम है कि वे उस परेशान in ??() के साथ समाप्त होते हैं, और कभी भी "मेरे" कोड से किसी भी फ़ंक्शन नाम सूचीबद्ध नहीं करते हैं।

मुझे लगता है कि यह कुछ संदेशों से संबंधित है जो gdb प्रारंभ होने पर मुद्रित होते हैं; उदाहरण के लिए,

Reading symbols from /xyz/mono/log4net.dll.so...(no debugging symbols found)...done. 
Loaded symbols for /xyz/mono/log4net.dll.so 
Reading symbols from /xyz/mono/Contoso.Util.dll.so...(no debugging symbols found)...done. 
Loaded symbols for /xyz/mono/Contoso.Util.dll.so 
Reading symbols from /xyz/mono/Contoso.Printing.dll.so...(no debugging symbols found)...done. 
Loaded symbols for /xyz/mono/Contoso.Printing.dll.so 
Reading symbols from /xyz/mono/Contoso.LegacyDataConverter.dll.so...(no debugging symbols found)...done. 
Loaded symbols for /xyz/mono/Contoso.LegacyDataConverter.dll.so 

क्यों सब *.dll.so फ़ाइलें "कोई डिबगिंग प्रतीकों मिला" किया है? क्या डीएलएल को खुद को "डीबग" मोड या कुछ में बनाया जाना चाहिए?

और अधिक आम तौर पर, मोनो कोर डंप से प्रबंधित स्टैक ट्रेस प्राप्त करने का कोई तरीका है? (mono_pmip का उपयोग कर, क्योंकि वह ही उपलब्ध है जब प्रक्रिया चल रहा है बिना।)

+0

"मोनो रनटाइम - डिबगिंग प्रतीकों" या इसी तरह के आपके भंडार में एक पैकेज होना चाहिए। इसे ढूंढें, इसे इंस्टॉल करें और फिर डीबगिंग का प्रयास करें। –

+0

'मोनो-एडन-कोर-डीबगिनोफो' नामक एक पैकेज है (सेंटोस के लिए)। मुझे लगता है कि यह है। – dan04

+0

यदि आप वास्तव में इसे ठीक नहीं कर सकते हैं तो आखिरी खाई के प्रयास के रूप में आप ऐप को 'वाइन' के तहत चला सकते हैं? आदर्श समाधान नहीं है लेकिन यदि आप वास्तव में अटक गए हैं तो यह काम कर सकता है। – Rots

उत्तर

2

मैं मोनो के बारे में पता नहीं है .. लेकिन प्रदान की स्टैकट्रेस में देखने से .. यह मोनो क्रम के लिए चिह्न प्राप्त करने में सक्षम नहीं दिखा। यहां link है जो gdb के साथ डीबगिंग देता है। प्रतीकों के साथ आपको मोनो-रनटाइम की आवश्यकता है i.e so प्रतीकों के साथ लाइब्रेरी ... तो आपको mono-runtime-dbg इंस्टॉल करने की आवश्यकता है ... आप इसे इंस्टॉल करने के लिए एपीटी-गेट, यम, wget जैसे टूल का उपयोग कर सकते हैं।

मैं Unbuntu स्थापित .. .... है जो उत्पादन निम्नलिखित शो

$ apt-cache search mono-runtime-dbg 
mono-runtime-dbg - Mono runtime, debugging symbols 

Then 
$ apt-get install mono-runtime-dbg 

आशा है कि आप इसे उपयोगी पाते ...

3

यह suspend-on-sigserv तो सेट देते हैं जब प्रक्रिया दुर्घटनाओं के लिए संभव नहीं होगा ? मुझे लगता है कि यह एक जीवंत वातावरण है इसलिए संभव नहीं हो सकता है।

यदि आप ऐसा कर सकते हैं तो आपको वह जानकारी मिलनी चाहिए जो आप बाद में कर रहे हैं।

docs से:

MONO_DEBUG

यदि इसे सेट डिबगिंग के लिए उपयोगी क्रम की कुछ सुविधाओं सक्षम बनाता है। इस चर में डिबगिंग विकल्पों की अल्पविराम से अलग सूची होनी चाहिए। वर्तमान में, निम्नलिखित विकल्पों के समर्थित हैं:

...

निलंबित-ऑन-SIGSEGV

यह विकल्प कार्यक्रम को निलंबित कर देगा जब एक देशी SIGSEGV प्राप्त होता है। यह डीबगिंग क्रैश के लिए उपयोगी है जो जीडीबी के तहत नहीं होता है, क्योंकि लाइव प्रक्रिया में मूल फ़ाइल की तुलना में अधिक जानकारी होती है।