JVMTI Class load callback not being called on Windows, but works on Linux

Charlie cvdcamilleri at gmail.com
Sun Jan 10 16:33:14 UTC 2021


Hi,

I have a working jvmti agent on Linux (Java(TM) SE Runtime Environment 
(build 1.8.0_271-b09)) that hooks the class load event.

This same agent compiled for windows claims to work (all asserts pass), 
but my hook never gets called, is anyone able to tell me why?

I register my callback like so:

jint res = vm->GetEnv(reinterpret_cast<void **>(&jvmti), JVMTI_VERSION_1);
     if (res != JNI_OK || jvmti==nullptr) {
         fprintf(stderr,"Unable to get JVMTI!");
     }
     assert(res == JVMTI_ERROR_NONE);

     jvmtiCapabilities capabilities = {0};
     capabilities.can_retransform_classes=1;
     capabilities.can_generate_all_class_hook_events  = 1;

     assert(jvmti->AddCapabilities(&capabilities) == JVMTI_ERROR_NONE);

     jvmtiEventCallbacks callbacks;
     memset(&callbacks,0,sizeof(callbacks));
     callbacks.ClassFileLoadHook = &class_file_load_hook_handler;
     assert(jvmti->SetEventCallbacks(&callbacks, sizeof(callbacks)) == 
JVMTI_ERROR_NONE);
     assert(jvmti->SetEventNotificationMode(JVMTI_ENABLE, 
JVMTI_EVENT_CLASS_FILE_LOAD_HOOK, nullptr) == JVMTI_ERROR_NONE);

The callback itself is as follows:

static void JNICALL class_file_load_hook_handler(
         jvmtiEnv* jvmti,
         JNIEnv* env,
         jclass class_being_redefined,
         jobject loader,
         const char* name,
         jobject protection_domain,
         jint class_data_len,
         const unsigned char* class_data,
         jint* new_class_data_len,
         unsigned char** new_class_data
) {
     if (name == nullptr) {
         return;
     }

     printf("loaded %s\n",name);

}

(to clarify, all JNI functions in the lib work fine)

The Windows machine's java version string is this:

java version "1.8.0_271"
Java(TM) SE Runtime Environment (build 1.8.0_271-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.271-b09, mixed mode)



More information about the hotspot-dev mailing list