Issue | Fix Version | Assignee | Priority | Status | Resolution | Resolved In Build |
---|---|---|---|---|---|---|
JDK-8063357 | 8u45 | Staffan Larsen | P3 | Resolved | Fixed | b01 |
JDK-8061888 | 8u40 | Staffan Larsen | P3 | Closed | Fixed | b12 |
JDK-8071093 | emb-8u47 | Staffan Larsen | P3 | Resolved | Fixed | team |
From: Jeremy Manson <jeremymanson@google.com>
Subject: Crash with TraceClassLoading
Date: 19 december 2013 21:01:02 CET
To: "hotspot-runtime-dev@openjdk.java.net" <hotspot-runtime-dev@openjdk.java.net>
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());
Jeremy
- backported by
-
JDK-8063357 TraceClassLoading expects there to be a (Java) caller when you load a class with the bootstrap class loader
-
- Resolved
-
-
JDK-8071093 TraceClassLoading expects there to be a (Java) caller when you load a class with the bootstrap class loader
-
- Resolved
-
-
JDK-8061888 TraceClassLoading expects there to be a (Java) caller when you load a class with the bootstrap class loader
-
- Closed
-