2011-08-30 17 views
15

मेरा जावा एप्लिकेशन नियमित रूप से एक SIGSEGV और स्टैक डेटा के डंप और टेक्स्ट फ़ाइल में जानकारी का एक लोड के साथ क्रैश करना शुरू कर दिया है।जब मैं अपना कोड चलाता हूं तो JVM में होने वाले सेगफाल्ट को कैसे डिबग कर सकता हूं?

मैंने जीडीबी में सी प्रोग्राम डीबग किया है और मैंने अपने आईडीई से जावा कोड डीबग किया है। मुझे यकीन नहीं है कि चल रहे जावा प्रोग्राम में सी-जैसे क्रैश कैसे पहुंचे।

मुझे लगता है कि मैं यहां एक जेवीएम बग नहीं देख रहा हूं। अन्य जावा प्रोग्राम ठीक चलते हैं, और सूर्य से जेवीएम शायद मेरे कोड से अधिक स्थिर है। हालांकि, मुझे नहीं पता कि मैं जावा कोड के साथ segfaults कैसे पैदा कर सकता हूं। निश्चित रूप से पर्याप्त स्मृति उपलब्ध है, और जब मैंने प्रोफाइलर में आखिरी बार चेक किया था, तो 80% के आसपास कभी-कभी स्पाइक्स के साथ ढेर का उपयोग लगभग 50% था। क्या कोई स्टार्टअप पैरामीटर है जो मैं जांच सकता हूं? इस तरह की बग के पास आने पर एक अच्छी चेकलिस्ट क्या होती है?

हालांकि मैं इस कार्यक्रम को विश्वसनीय रूप से पुन: उत्पन्न करने में सक्षम नहीं हूं, ऐसा लगता है कि यह पूरी तरह से यादृच्छिक रूप से नहीं होता है, इसलिए परीक्षण पूरी तरह असंभव नहीं है।

अनुमानित समय। रक्तमय विवरण

(मैं एक सामान्य दृष्टिकोण के लिए देख रहा हूँ, क्योंकि वास्तविक समस्या बहुत विशिष्ट हो सकता है में से कुछ फिर भी, कुछ जानकारी मैं पहले से ही एकत्र है और इस बात का हो सकता है कुछ मूल्य।)

एक समय पहले, मैं अपने सीआई सर्वर (अधिक जानकारी के लिए here देखें) अपग्रेड करने के बाद एक समान दिखने वाले मुसीबत था, लेकिन है कि ठीक (-XX:MaxPermSize करना) इस समय मदद नहीं की।

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

+0

क्या आप एक स्टैक ट्रेस प्राप्त कर सकते हैं? क्या यह एक ही स्थान पर एसईजीवी है? क्या हमारे पास काम करने के लिए और जानकारी हो सकती है? –

+0

क्या आपके आवेदन में कोई मूल कोड है? यदि JVM बाइटकोड के किसी भी संग्रह की अनुमति देता है, इससे कोई फर्क नहीं पड़ता कि बाइटकोड कैसे हो सकता है, एक segfault को उत्तेजित करने के लिए, फिर _ वास्तव में आप एक JVM (या JRE) बग को देख रहे हैं। –

+0

@Ed - मेरे पास बहुत सारे स्टैक ट्रेस हैं, लेकिन यह टेक्स्ट की एक विशाल दीवार है। पोस्ट करने के लिए कौन सा हिस्सा सबसे उपयोगी होगा? मैं मुख्य रूप से इस प्रकार की समस्या से संपर्क करने के लिए एक सामान्य तरीका ढूंढ रहा हूं, इसलिए मैं यहां बहुत विशिष्ट जानकारी के भार को डंप करने में संकोच नहीं कर रहा हूं। –

उत्तर

22

मुझे लगता है कि मैं यहां एक जेवीएम बग नहीं देख रहा हूं। अन्य जावा प्रोग्राम बस ठीक है, और सूर्य से जेवीएम शायद मेरे कोड से अधिक स्थिर है।

मुझे नहीं लगता कि आपको यह धारणा बनाना चाहिए। JNI का उपयोग किए बिना, आपको जावा कोड लिखने में सक्षम नहीं होना चाहिए जो SIGSEGV का कारण बनता है (हालांकि हम जानते हैं कि ऐसा होता है)। मेरा मुद्दा यह है कि, जब ऐसा होता है, तो यह जेएमवी (अनसुना नहीं) या कुछ जेएनआई कोड में एक बग में एक बग है। यदि आपके पास अपने कोड में कोई जेएनआई नहीं है, तो इसका मतलब यह नहीं है कि आप कुछ लाइब्रेरी का उपयोग नहीं कर रहे हैं, तो इसकी तलाश करें। जब मैंने पहले इस तरह की समस्या देखी है, तो यह एक छवि हेरफेर पुस्तकालय में था। यदि अपराधी आपके अपने जेएनआई कोड में नहीं है, तो आप शायद बग को 'ठीक' करने में सक्षम नहीं होंगे, लेकिन आप अभी भी इसके आसपास काम करने में सक्षम हो सकते हैं।

सबसे पहले, आपको एक ही मंच पर वैकल्पिक JVM प्राप्त करना चाहिए और इसे पुन: पेश करने का प्रयास करना चाहिए। आप one of these alternatives आज़मा सकते हैं।

यदि आप इसे पुन: पेश नहीं कर सकते हैं, तो यह संभवतः एक जेवीएम बग है। उस से, आप या तो एक विशेष JVM या search the bug database को जरूरी कर सकते हैं, जो आप इसे पुन: उत्पन्न करने के बारे में जानते हैं, और शायद सुझाए गए कामकाज प्राप्त कर सकते हैं। गलती कि हो सकता है (यहां तक ​​कि अगर आप इसे पुन: पेश कर सकते हैं, कई JVM कार्यान्वयन बस Oracle की हॉटस्पॉट कार्यान्वयन पर तोड़ मरोड़ कर रहे हैं, तो यह अभी भी एक JVM बग हो सकता है।)

आप एक विकल्प JVM के साथ पुन: पेश कर सकते हैं, आपके पास कुछ जेएनआई बग है। देखें कि आप कौन सी लाइब्रेरी का उपयोग कर रहे हैं और वे कौन सी देशी कॉल कर सकते हैं। कभी-कभी एक ही पुस्तकालय या वैकल्पिक पुस्तकालयों के लिए वैकल्पिक "शुद्ध जावा" कॉन्फ़िगरेशन या जार फ़ाइलें होती हैं जो लगभग एक ही चीज़ करती हैं।

शुभकामनाएं!

+4

+1 "आप शायद बग को ठीक करने में सक्षम नहीं होंगे": इसलिए पोस्टर के प्रश्न का उत्तर "मैं अपने कोड को चलाने पर जेवीएम में सेगफाल्ट्स को कैसे डिबग कर सकता हूं?" है "* आप * नहीं"। – Raedwald

9

निम्नलिखित मूल रूप से बेकार होगा जब तक कि आपके पास मूल कोड न हो। हालांकि, यहां जाता है।

  1. जावा डीबगर में जावा प्रोग्राम शुरू करें, संभवतः संभव sigsegv से पहले ब्रेकपॉइंट के साथ।
  2. जावा की प्रोसेसिड प्राप्त करने के लिए ps कमांड का उपयोग करें।
  3. gdb/usr/lib/JVM/धूप में Java6/bin/जावा ProcessID
  4. सुनिश्चित करें कि gdb 'हैंडल' कमांड SIGSEGV पर रोकने के लिए
  5. ब्रेकप्वाइंट से जावा डीबगर में जारी रखने के लिए निर्धारित है।
  6. विस्फोट के लिए प्रतीक्षा करें।
  7. उपयोग की जांच के लिए

तुम सच में JVM अपनी खुद की किसी भी मूल कोड के बिना एक SIGSEGV लेने में कामयाब गया है gdb, तुम बहुत आगे आप क्या देखेंगे की कोई मतलब की संभावना नहीं है, और सबसे अच्छा आप एक परीक्षण मामले को एक बग रिपोर्ट पर धक्का दे सकते हैं।

+1

क्या उसे JVM के विशेष संस्करण की आवश्यकता होगी? सी से, जब मैं gdb का उपयोग करना चाहता हूं, तो मुझे डीबग प्रतीकों के साथ पुन: संकलन करने के लिए उपयोग किया जाता है। –

+0

मेरे अनुभव में JVM हमेशा बैकट्रैस के लिए पर्याप्त प्रतीकों है। यदि आप वास्तव में इसे विस्तार से डीबग करना चाहते हैं, तो, खुले जेडीके और डीबग बिल्ड को बंद करें। – bmargulies

2

मुझे http://www.oracle.com/technetwork/java/javase/crashes-137240.html पर एक अच्छी सूची मिली। चूंकि मुझे जीसी के दौरान दुर्घटनाएं मिल रही हैं, मैं कचरा कलेक्टरों के बीच स्विच करने की कोशिश करूंगा।

मैंने धारावाहिक और समांतर जीसी (बाद में 64-बिट लिनक्स सर्वर पर डिफ़ॉल्ट होने के बीच स्विचिंग करने की कोशिश की), इसने केवल तदनुसार त्रुटि संदेश बदल दिया।

प्रोफाइलर में एक नए विश्लेषण के बाद 16 जी से 10 जी तक अधिकतम ढेर आकार को कम करना (जिसने मुझे 8 जी पर एक ढेर का उपयोग किया था) ने काफी कम "वर्चुअल मेमोरी" पदचिह्न (60 के बजाय 16 जी) का नेतृत्व किया, लेकिन मुझे यह भी नहीं पता कि इसका क्या अर्थ है, और इंटरनेट कहता है, इससे कोई फर्क नहीं पड़ता।

वर्तमान में, जेवीएम क्लाइंट मोड में चल रहा है (-client स्टार्टअप विकल्प का उपयोग करके इस प्रकार -server के डिफ़ॉल्ट को ओवरराइड कर रहा है)। अब तक, कोई दुर्घटना नहीं है, लेकिन प्रदर्शन प्रभाव अपेक्षाकृत बड़ा लगता है।

0

यदि आपके पास कोरफाइल है तो आप उस पर जेस्टैक चलाने का प्रयास कर सकते हैं, जो आपको थोड़ा और समझदार समझ देगा - http://download.oracle.com/javase/6/docs/technotes/tools/share/jstack.html देखें, हालांकि यदि यह जीसी थ्रेड में एक बग है तो यह सब उपयोगी नहीं हो सकता है।

0

यह जांचने का प्रयास करें कि सी प्रोग्राम कार्श जिसने जावा क्रैश का कारण बनाया है। उपयोग करने के लिए वाल्ग्रिंड अमान्य और चेक स्टैक आकार भी पार करें।

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

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