2015-05-07 5 views
7

के साथ क्रैश करने का कारण बनता है मैं JVM में सभी ऑब्जेक्ट्स के आवंटन को ट्रैक करने का प्रयास कर रहा हूं।जावा/लैंग/ऑब्जेक्ट में invokestatic जोड़ना। <init> जेवीएम टीआई एजेंट के माध्यम से जेवीएम को segfault

आवंटन प्रोफाइलर के बारे में कई दस्तावेजों में यह उल्लेख किया गया था कि ऐसा करने के लिए सबसे आसान तरीका यह है: java/lang/Object.<init> को invokestatic Tracker.trackAllocation()V अनुदेश जोड़ने (सामान्य रूप से यह एक एकल return अनुदेश के होते हैं, हम इसे पहले invokestatic जोड़ने, तो यह 2 है निर्देश अब)।

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

क्लास फ़ाइल ऑनक्लास लोडेड हुक में जेवीएम टीआई एजेंट के साथ वाद्य यंत्र है।

हालांकि, invokestatic निर्देश जोड़ने के बाद जेवीएम segfault के साथ दुर्घटनाग्रस्त हो गया। ट्रैकर ऑब्जेक्ट बूटस्ट्रैप क्लासलोडर में जोड़ा जाता है, इसलिए इसे किसी भी स्तर पर दिखाई देना चाहिए। मैंने invokestatic के बजाय nop जोड़ने का प्रयास किया, और JVM संशोधित ऑब्जेक्ट क्लास के साथ ठीक काम करता है। तो समस्या विशेष रूप से कुछ स्थैतिक विधि के आविष्कार के साथ है।

मैंने उपकरण (आधार का हिस्सा नहीं) के लिए भी आवेदन करने की कोशिश की और यह ठीक काम करता था - ट्रैकर को बुलाया गया और कोई दुर्घटना नहीं हुई। इसके अलावा मैंने ऑब्जेक्ट को दो बिंदुओं पर फिर से परिभाषित करने का प्रयास किया: जब इसे प्रारंभ में लोड किया जाता है (पहली बार लोड किया गया वर्ग), या vmInit ईवेंट के बाद (जब सभी आधार वर्ग लोड होते हैं और जेनी पर प्रतिबंध हटा दिए जाते हैं)।

क्या जावा में कुछ भी है जो मुझे java.lang.Object के बारे में याद आ रही है?

एजेंट के लिए कोड यहाँ है: https://gist.github.com/Korobochka/3bf2f906f6ab85b22dec (त्रुटि जाँच छीन रहा है, कक्षाओं को बदलने के लिए कोड भी शामिल नहीं है, लेकिन यह अन्य वर्गों के लिए काफी अच्छी तरह से काम करता है)

+0

हमें कोड दिखाएं – apangin

+0

@apangin I ने प्रश्न के निचले हिस्से में एजेंट कोड के साथ गिस्ट जोड़ा। यह वह संस्करण है जहां vmInit के बाद ऑब्जेक्ट बदल दिया गया है। – Korobochka

+1

मुझे लगता है कि समस्या यह है कि 'ट्रैकर' क्लास एक ऑब्जेक्ट है, जिसे किसी ऑब्जेक्ट के निर्माण से पहले तुरंत चालू करने की आवश्यकता होती है, लेकिन उसे कक्षा को पहले लोड करने की आवश्यकता होगी ... और इसी तरह। आपको किसी भी तरह से उस चक्र को तोड़ने की जरूरत है। – biziclop

उत्तर

5

ऐसा लगता है कि समस्या System.out.println बुला में है LeakAgentInterface से। सबसे पहले, System.out अभी तक प्रारंभ नहीं किया जा सकता है। दूसरा, println वस्तुओं को स्वयं आवंटित कर सकता है।

+1

और इसमें 'स्ट्रिंग' शामिल है जो मुद्रित किया जाएगा जो एक ऑब्जेक्ट भी है; यहां तक ​​कि संकलन-समय निरंतर 'स्ट्रिंग को रनटाइम पर आवंटित किया जाना चाहिए जब उन्हें पहली बार उपयोग किया जाता है ... – Holger

+0

बस चेक किया गया, यह वास्तव में मामला है। आपका बहुत बहुत धन्यवाद!मैंने इस पर कुछ घंटों बर्बाद कर दिए और गलती बहुत सरल और बेवकूफ थी (लेकिन मैं केवल सी ++ कोड में बग की तलाश में था। मुझे मूर्खतापूर्ण। – Korobochka

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