के साथ क्रैश करने का कारण बनता है मैं 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 (त्रुटि जाँच छीन रहा है, कक्षाओं को बदलने के लिए कोड भी शामिल नहीं है, लेकिन यह अन्य वर्गों के लिए काफी अच्छी तरह से काम करता है)
हमें कोड दिखाएं – apangin
@apangin I ने प्रश्न के निचले हिस्से में एजेंट कोड के साथ गिस्ट जोड़ा। यह वह संस्करण है जहां vmInit के बाद ऑब्जेक्ट बदल दिया गया है। – Korobochka
मुझे लगता है कि समस्या यह है कि 'ट्रैकर' क्लास एक ऑब्जेक्ट है, जिसे किसी ऑब्जेक्ट के निर्माण से पहले तुरंत चालू करने की आवश्यकता होती है, लेकिन उसे कक्षा को पहले लोड करने की आवश्यकता होगी ... और इसी तरह। आपको किसी भी तरह से उस चक्र को तोड़ने की जरूरत है। – biziclop