Crash with TraceClassLoading
David Holmes
david.holmes at oracle.com
Tue Jan 7 21:11:51 PST 2014
On 7/01/2014 9:46 PM, Staffan Larsen wrote:
> This looks good to me. I can sponsor the fix once we have second review.
>
> It’s unfortunate that our current test infrastructure does not allow us to write tests with native code…
>
> /Staffan
>
>
> On 19 dec 2013, at 21:01, Jeremy Manson <jeremymanson at google.com> wrote:
>
>> Now that 9 is underway, presumably we can start feeding back fixes again.
>>
>> This one's a bit obscure. TraceClassLoading expects there to be a (Java) caller when you load a class with the bootstrap class loader. However, there are ways of loading a class that don't involve having a Java caller. For example, you can do so from a JVMTI hook. A reproduction is attached, and here's a patch:
>>
>> diff --git a/src/share/vm/classfile/classFileParser.cpp b/src/share/vm/classfile/classFileParser.cpp
>> --- a/src/share/vm/classfile/classFileParser.cpp
>> +++ b/src/share/vm/classfile/classFileParser.cpp
>> @@ -4098,8 +4098,12 @@
>> tty->print("[Loaded %s from %s]\n", this_klass->external_name(),
>> cfs->source());
>> } else if (class_loader.is_null()) {
>> - if (THREAD->is_Java_thread()) {
>> - Klass* caller = ((JavaThread*)THREAD)->security_get_caller_class(1);
>> + Klass* caller =
>> + THREAD->is_Java_thread()
>> + ? ((JavaThread*)THREAD)->security_get_caller_class(1)
>> + : NULL;
>> + // caller can be NULL, for example, during a JVMTI VM_Init hook
>> + if (caller != NULL) {
>> tty->print("[Loaded %s by instance of %s]\n",
>> this_klass->external_name(),
>> InstanceKlass::cast(caller)->external_name());
Shouldn't we have an "else" there to say "loaded %s via native
mechanism" or something like that?
Thanks,
David
>> Jeremy
>> <Makefile><tcl.cc>
>
More information about the hotspot-runtime-dev
mailing list