Что касается 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
.
Безопасный способ изменения неуправляемых флагов JVM во время выполнения. Однако в Linux есть уродливый взлом.
- Прочитать
/proc/self/maps
, чтобы найти базовый адрес libjvm.so
.
- Используйте ELF format reader, чтобы обнаружить смещение нужного символа в динамической библиотеке.
- Напишите прямо на адрес этого символа.
Это a sample code для этого.
Если вы не нашли юридического решения, существует gory-подход от @apangin: https://github.com/odnoklassniki/one-elf/blob/master/test/one/jvm/HotspotFlags.java он находит адрес загруженный libjvm.so и вычисляет адрес флага с .so адресом + .symtab постоянным смещением (но он не всегда работает, зависит от использования конкретного флага в коде VM) – qwwdfsad