DebugNonSafepoints
के रूप में आपको इस ध्वज को सेट करने की भी आवश्यकता नहीं है। debugInfoRec.cpp को देखो: ध्वज सेट नहीं है
static inline bool compute_recording_non_safepoints() {
if (JvmtiExport::should_post_compiled_method_load()
&& FLAG_IS_DEFAULT(DebugNonSafepoints)) {
// The default value of this flag is taken to be true,
// if JVMTI is looking at nmethod codes.
// We anticipate that JVMTI may wish to participate in profiling.
return true;
}
// If the flag is set manually, use it, whether true or false.
// Otherwise, if JVMTI is not in the picture, use the default setting.
// (This is true in debug, just for the exercise, false in product mode.)
return DebugNonSafepoints;
}
हैं, डिबग जानकारी अभी भी दर्ज की गई है जब JVMTI CompiledMethodLoad सूचनाएं सक्षम हैं। आपको बस can_generate_compiled_method_load_events
क्षमता का अनुरोध करने की आवश्यकता है और JVMTI_EVENT_COMPILED_METHOD_LOAD
सूचनाएं चालू करें।
यह ठीक है कि मैं इसे अपने async-profiler
प्रोजेक्ट में कैसे संभालता हूं।
रन-टाइम में अप्रबंधनीय जेवीएम ध्वज बदलने का कोई सुरक्षित तरीका नहीं है। हालांकि, लिनक्स पर ऐसा करने के लिए एक बदसूरत हैक है।
libjvm.so
का मूल पता खोजने के लिए /proc/self/maps
पढ़ें।
- गतिशील पुस्तकालय में वांछित प्रतीक के ऑफसेट की खोज के लिए ELF format reader का उपयोग करें।
- सीधे इस प्रतीक के पते पर लिखें।
इस चाल के लिए a sample code है।
यदि आपको कानूनी समाधान नहीं मिलेगा, तो @apangin से gory दृष्टिकोण है: https://github.com/odnoklassniki/one-elf/blob/master/test/one/jvm/HotspotFlags.java इसे पता पता चला libjvm.so लोड किया गया है और .so पता + .symtab निरंतर ऑफ़सेट से ध्वज पता की गणना करता है (लेकिन यह हमेशा काम नहीं करता है, वीएम कोड में ठोस ध्वज उपयोग पर निर्भर करता है) – qwwdfsad