2010-08-13 10 views
5

मैं जावा कार्यक्रमों प्रोफ़ाइल, जो ज्यादातर समारोह AsyncGetCallTrace का उपयोग कर निश्चित समय अंतराल पर यादृच्छिक धागे से स्टैक ट्रेस प्राप्त करने के जरूरत पर जोर देता JVMTI कोड लिख रहा हूँ करने के लिए। इस प्रकार, मैं कॉलट्रेस संरचनाएं प्राप्त करने में सक्षम हूं, जिनमें से प्रत्येक में कॉलफ्रेम संरचनाओं की एक सरणी है, जिसमें स्टैक ट्रेस में अलग-अलग फ्रेम के बारे में डेटा शामिल है। विशेष रूप से, इन डेटा में शामिल हैं: jmethodID method_id (जावा विधि की आईडी जहां फ्रेम स्थित है), और: जिंट लिनेनो (.class फ़ाइल में विधि का बीसीआई, जहां तक ​​मैं प्रलेखन को समझता हूं)। मुझे JVMTI फ्रेमवर्क का उपयोग करके इस "lineno" को संबंधित स्रोत कोड लाइन नंबर में परिवर्तित करने का कोई तरीका नहीं दिख रहा है (कम से कम/usr/lib/jvm/java-6-sun/include में शामिल फ़ाइल jvmti.h देखें। लिनक्स पर)। वास्तव में, यहां तक ​​कि JVMTI ढांचे के बाहर, केवल एक चीज मैं वेब पर मिल सकता है अब तक यहाँ था: http://jakarta.apache.org/bcel/apidocs/org/apache/bcel/classfile/LineNumberTable.html, लेकिन फिर भी यह कर नहीं किया जा सकता मैं क्या पसंद करेंगे, और अतिरिक्त स्थापना की आवश्यकता है, और मुझे डेटा को संसाधित करने की आवश्यकता है, जिसे एक अलग जावा प्रोग्राम का उपयोग करके सी ++ जेएमवीटीआई कोड द्वारा उत्पन्न किया गया था।परिवर्तित बीसीआई (बाईटकोड सूचकांक) स्रोत कोड लाइन नंबर

किसी को भी जानता है कि कैसे JVMTI (या यहां तक ​​कि किसी भी तरह से) के भीतर से स्रोत कोड लाइन नंबर के लिए बीसीआई कन्वर्ट करने के लिए, कृपया मदद!

[कोई अच्छी तरह से इस क्षेत्र को जानता है, तो कृपया मुझे बताएं, क्योंकि मैं इस प्रक्रिया के बारे में पूछने के लिए कुछ और प्रश्न पूछना चाहते हैं।]

उत्तर

5

मुझे लगता है मैं कुछ हद तक यह समझ से बाहर। उपयोग करने की मुख्य विधि jvmti-> GetLineNumberTable (...) है, जो jvmtiLineNumberEntry सरणी भरती है। यह देखते हुए बीसीआई लाइन संख्या n (जो एक स्रोत लाइन नंबर करने के लिए मैप किया जा रहा है), जिसके लिए int i है परीक्षण कर सकते हैं: jvmtiLineNumberEntryArray [i] < = n < jvmtiLineNumberEntryArray [i + 1]। यह int मैं वांछित संबंधित स्रोत कोड लाइन संख्या है।

एक पकड़ कि AsyncGetCallTrace, किसी कारण से, लगातार अजीब BCIs देता है, इसलिए हालांकि मानचित्रण सटीक स्रोत कोड लाइन नंबर देता है, वे अभी भी सही नहीं कर रहे हैं, क्योंकि मूल BCIs सटीक नहीं हैं। यह क्यों है, मुझे नहीं पता। मैं सन स्टूडियो प्रोफाइलर का उपयोग करने की उम्मीद कर रहा था, जो यह जांचने के लिए कि असफल लाइन नंबर वही होगा जैसा कि वे मेरे प्रोफाइलर के लिए हैं। उस स्थिति में, AsyncGetCallTrace फ़ंक्शन गलत है। लेकिन अब तक, सन स्टूडियो का उपयोग करके स्वयं की चुनौती बन गई है। अगर किसी को भी इस उपकरण का उपयोग करने के बारे में पता है, तो कृपया मदद करें!

एक बड़ा पकड़ है कि जावा तरीके अक्सर inlined रहे है, इसलिए लाइन नंबर हमेशा सही ढंग से नक्शा नहीं है। असल में, यह उपरोक्त अनुच्छेद में वर्णित समस्या का कारण हो सकता है, हालांकि यह उन संख्याओं के आधार पर असंभव लगता है जो मैं देख रहा हूं। http://developer.amd.com/documentation/articles/pages/JVMTIEventPiggybacking.aspx

: यहाँ इनलाइनिंग समस्या को हल करने के बारे में कुछ जानकारी है
संबंधित मुद्दे