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

Daniel D. Daugherty daniel.daugherty at oracle.com
Mon Jan 11 13:59:41 UTC 2021


Redirecting to the serviceability-dev at ... alias since JVM/TI is maintained
by the Serviceability team...

Dan

On 1/10/21 6:09 PM, Mikael Vidstedt wrote:
> Just a control question: Are you *sure* asserts are actually enabled? Having actual application logic in an assert is normally a bad idea because if/when you compile the release/production version with asserts disabled the application behavior will change.
>
> Cheers,
> Mikael
>
>> On Jan 10, 2021, at 8:33 AM, Charlie <cvdcamilleri at gmail.com> wrote:
>>
>> 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 serviceability-dev mailing list