2011-03-14 9 views
5

मेरे पास एक जावा एप्लिकेशन है जो जेएनआई के माध्यम से विरासत आवेदन के कई मूलभूत तरीकों को कॉल करता है। लेकिन JVM किसी भी जेएनआई कॉल के बाहर यादृच्छिक स्थानों पर एक स्टैक डंप के साथ दुर्घटनाग्रस्त हो जाता है। कभी-कभी यह जीसी के दौरान दुर्घटनाग्रस्त हो जाता है, कभी-कभी कक्षा लोडिंग और अन्य स्थानों के दौरान। मुझे संदेह है कि एक या अधिक देशी विधियां जेवीएम ढेर या कुछ अन्य डेटा संरचना को दूषित कर रही हैं। मुझे यह जानने की जरूरत है कि यह कौन सा कॉल है, इसलिए मैं मूल कार्यान्वयन को ठीक कर सकता हूं।जेएनआई ढेर भ्रष्टाचार की समस्याओं को कैसे डीबग करें?

विरासत आवेदन एक तृतीय पक्ष डीएलएल है जिसके लिए मेरे पास स्रोत नहीं हैं और न ही प्रतीक जानकारी है। इसे जावा से कॉल करने योग्य बनाने के लिए, मैंने एक रैपर डीएलएल बनाया जो जेएनआई कॉलिंग सम्मेलनों का उपयोग करता है।

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

क्या आपको कुछ ऐसा पता है जो मदद कर सकता है?

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

+0

मुझे लगता है कि आप '-Xcheck: jni' के बारे में जानते हैं? – Erik

+0

हां, लेकिन पूछने के लिए धन्यवाद। – fernacolo

+0

मुझे एक ही समस्या है, अगर इससे मदद मिलती है:/मुझे जेएनआई के माध्यम से बहुत सारे डेटा मिलते हैं, और कभी-कभी मुझे भ्रष्ट पता और पैकेट डेटा मिलता है। यह पूरे सिमुलेशन को खराब करता है, और यह वास्तव में कष्टप्रद है। –

उत्तर

5

क्योंकि मैं जवाब से बाहर गया और खुद से एक तैयार समाधान नहीं मिला, मैं समस्या की पहचान करने के लिए शुद्ध सी ++ में एक सैंडबॉक्स प्रक्रिया का निर्माण समाप्त कर दिया। मेरा जावा ऐप प्रोसेसबिल्डर का उपयोग करके सैंडबॉक्स प्रक्रिया को तुरंत चालू करता है और फिर stdin और stdout का उपयोग करके इसके साथ संचार करता है। जेवीएम के बजाए, यह सैंडबॉक्स है जो वास्तव में विरासत डीएलएल लोड करता है और कॉल करता है। फिर मैंने माइक्रोसॉफ्ट के एप्लीकेशन सत्यापनकर्ता का उपयोग करके सैंडबॉक्स प्रक्रिया की निगरानी की, जिसमें स्मृति भ्रष्टाचार की समस्या मिली - उम्मीद से अपेक्षाकृत बफर पास करने वाला एक कॉल था। इसकी पहचान के बाद, मैंने जावा ऐप में बफर के रूप में उपयोग की जाने वाली बाइट [] की लंबाई बढ़ा दी, और अब जेवीएम सैंडबॉक्स के उपयोग के बिना डीएलएल को सीधे कॉल कर सकता है।

कुल मिलाकर, मैं लगभग 10 दिन खो गया क्योंकि JVM के पास प्रत्येक जेएनआई कॉल के बाद ढेर को सत्यापित करने का विकल्प नहीं है। लेकिन कम से कम अब अगर किसी को दुर्घटना मिलती है तो हम इसे सैंडबॉक्स का उपयोग करके जल्दी से डीबग कर सकते हैं।

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