Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8031376

TraceClassLoading expects there to be a (Java) caller when you load a class with the bootstrap class loader

    XMLWordPrintable

    Details

    • Type: Bug
    • Status: Closed
    • Priority: P3
    • Resolution: Fixed
    • Affects Version/s: 9
    • Fix Version/s: 9
    • Component/s: hotspot
    • Labels:
      None
    • Subcomponent:
    • Resolved In Build:
      b03

      Backports

        Description


        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

          Attachments

            Issue Links

              Activity

                People

                Assignee:
                Unassigned Unassigned
                Reporter:
                sla Staffan Larsen (Inactive)
                Votes:
                0 Vote for this issue
                Watchers:
                2 Start watching this issue

                  Dates

                  Created:
                  Updated:
                  Resolved: