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

jstack -l crashes VM when a Java mirror for a primitive type is locked

    Details

    • Subcomponent:
    • Resolved In Build:
      b77
    • CPU:
      generic
    • OS:
      generic

      Backports

        Description

        This bug affects all versions of HotSpot from JDK6 and above after JDK-6300884.

        A crash is reported against JDK6u32 for segfaulting while printing the Java stacks. Its hs_err file is like:

        #
        # A fatal error has been detected by the Java Runtime Environment:
        #
        # SIGSEGV (0xb) at pc=0x00007f6bdf6b5982, pid=20936, tid=1110554976
        #
        # JRE version: 6.0_32-b05
        # Java VM: Java HotSpot(TM) 64-Bit Server VM (20.7-b02 mixed mode linux-amd64 )
        # Problematic frame:
        # V [libjvm.so+0x62c982] Klass::external_name() const+0x12
        #
        # If you would like to submit a bug report, please visit:
        # http://java.sun.com/webapps/bugreport/crash.jsp
        #

        --------------- T H R E A D ---------------

        Current thread (0x00000000402a1800): VMThread [stack: 0x000000004221b000,0x000000004231c000] [id=20990]

        siginfo:si_signo=SIGSEGV: si_errno=0, si_code=1 (SEGV_MAPERR), si_addr=0x0000000000000018

        Registers:
        RAX=0x0000000000000000, RBX=0x00007f6bd6972060, RCX=0x00007f6bdfb0e790, RDX=0x0000000000000010
        RSP=0x000000004231a790, RBP=0x000000004231a7e0, RSI=0x0000000000000010, RDI=0x0000000000000010
        R8 =0x000000000000001f, R9 =0x0000000000000008, R10=0x0000000000000007, R11=0x00007f6bdfb29320
        R12=0x00000000402a1d60, R13=0x0000000000000010, R14=0x00007f6bdf961cf2, R15=0x0000000040260020
        RIP=0x00007f6bdf6b5982, EFLAGS=0x0000000000010206, CSGSFS=0x0000000000000033, ERR=0x0000000000000004
          TRAPNO=0x000000000000000e

        Top of Stack: (sp=0x000000004231a790)
        0x000000004231a790: 0000000040260058 0000000040260028
        0x000000004231a7a0: 00007f5752022e20 00007f5752022e40
        0x000000004231a7b0: 00007f5752022ec0 00007f6bdfc80d60
        0x000000004231a7c0: 00007f6bd6972060 00000000402a1d60
        0x000000004231a7d0: 0000000000000000 00007f6bdf961cf2
        0x000000004231a7e0: 000000004231a860 00007f6bdf8e04c1
        0x000000004231a7f0: 010000004231a810 00007f5752022e70
        0x000000004231a800: 0000000000000000 000000004352ce90
        0x000000004231a810: 00000000402a0d60 000000004025ffd0
        0x000000004231a820: 0000000040260380 00000000402603b8
        0x000000004231a830: 0000000040260380 00007f6bdfb2cf10
        0x000000004231a840: 0000000040260020 0000000000000000
        0x000000004231a850: 0000000000000000 000000004352ce90
        0x000000004231a860: 000000004231abe0 00007f6bdf8a614d
        0x000000004231a870: 0000000000000000 000000004231ab60
        0x000000004231a880: 000000004382f850 00007f6bdbc7427e
        0x000000004231a890: 00007f6bdbc74210 0000000000000000
        0x000000004231a8a0: 0000000000000000 000000004382f850
        0x000000004231a8b0: 0000000000000000 0000000000000000
        0x000000004231a8c0: 0000000000000000 0000000000000000
        0x000000004231a8d0: 0000000000000000 0000000000000000
        0x000000004231a8e0: 0000000000000000 0000000000000000
        0x000000004231a8f0: 0000000000000000 0000000000000000
        0x000000004231a900: 0000000000000000 0000000000000000
        0x000000004231a910: 0000000000000000 0000000000000000
        0x000000004231a920: 0000000000000000 0000000000000000
        0x000000004231a930: 0000000000000000 0000000000000000
        0x000000004231a940: 0000000000000000 0000000000000000
        0x000000004231a950: 0000000000000000 0000000000000000
        0x000000004231a960: 0000000000000000 0000000000000000
        0x000000004231a970: 0000000000000000 0000000000000000
        0x000000004231a980: 0000000000000000 0000000000000000

        Instructions: (pc=0x00007f6bdf6b5982)
        0x00007f6bdf6b5962: 83 ef 10 48 89 e5 ff d6 c9 c3 66 66 66 90 55 48
        0x00007f6bdf6b5972: 89 e5 41 56 41 55 49 89 fd 41 54 53 48 83 ec 30
        0x00007f6bdf6b5982: 8b 47 08 85 c0 0f 8e f3 00 00 00 48 83 bf f8 00
        0x00007f6bdf6b5992: 00 00 00 0f 84 e5 00 00 00 48 8b 7f 60 48 8b 17

        Register to memory mapping:

        RAX=0x0000000000000000 is an unknown value
        RBX=0x00007f6bd6972060 is an oop
        java.lang.Class
         - klass: 'java/lang/Class'
        RCX=0x00007f6bdfb0e790: <offset 0xa85790> in /home/work/hadoop-v2/java6/jre/lib/amd64/server/libjvm.so at 0x00007f6bdf089000
        RDX=0x0000000000000010 is an unknown value
        RSP=0x000000004231a790 is an unknown value
        RBP=0x000000004231a7e0 is an unknown value
        RSI=0x0000000000000010 is an unknown value
        RDI=0x0000000000000010 is an unknown value
        R8 =0x000000000000001f is an unknown value
        R9 =0x0000000000000008 is an unknown value
        R10=0x0000000000000007 is an unknown value
        R11=0x00007f6bdfb29320: <offset 0xaa0320> in /home/work/hadoop-v2/java6/jre/lib/amd64/server/libjvm.so at 0x00007f6bdf089000
        R12=0x00000000402a1d60 is an unknown value
        R13=0x0000000000000010 is an unknown value
        R14=0x00007f6bdf961cf2: <offset 0x8d8cf2> in /home/work/hadoop-v2/java6/jre/lib/amd64/server/libjvm.so at 0x00007f6bdf089000
        R15=0x0000000040260020 is an unknown value


        Stack: [0x000000004221b000,0x000000004231c000], sp=0x000000004231a790, free space=1021k
        Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
        V [libjvm.so+0x62c982] Klass::external_name() const+0x12
        V [libjvm.so+0x8574c1] javaVFrame::print_lock_info_on(outputStream*, int)+0x221
        V [libjvm.so+0x81d14d] JavaThread::print_stack_on(outputStream*)+0x1dd
        V [libjvm.so+0x81fb7e] Threads::print_on(outputStream*, bool, bool, bool)+0x21e
        V [libjvm.so+0x86e5d8] VM_PrintThreads::doit()+0x18
        V [libjvm.so+0x86e29a] VM_Operation::evaluate()+0x4a
        V [libjvm.so+0x86d862] VMThread::evaluate_operation(VM_Operation*)+0x82
        V [libjvm.so+0x86dad8] VMThread::loop()+0x198
        V [libjvm.so+0x86d5de] VMThread::run()+0x6e
        V [libjvm.so+0x71170f] java_start(Thread*)+0x13f

        VM_Operation (0x000000004352ce20): PrintThreads, mode: safepoint, requested by thread 0x00007f575de76000


        On the jstack side, the output is like:

        Exception in thread "main" java.io.IOException: Premature EOF
                at sun.tools.attach.HotSpotVirtualMachine.readInt(HotSpotVirtualMachine.java:226)
                at sun.tools.attach.LinuxVirtualMachine.execute(LinuxVirtualMachine.java:175)
                at sun.tools.attach.HotSpotVirtualMachine.executeCommand(HotSpotVirtualMachine.java:195)
                at sun.tools.attach.HotSpotVirtualMachine.remoteDataDump(HotSpotVirtualMachine.java:156)
                at sun.tools.jstack.JStack.runThreadDump(JStack.java:159)
                at sun.tools.jstack.JStack.main(JStack.java:94)


        It it caused by print_locked_object_class_name() blindly casting a java.lang.Class oop to its Klass and getting the external name from there. Java mirrors for primitive types do not have a backing Klass, so we should special case for them here.

        A proposed fix for current JDK9:


        $ hg diff
        diff -r 18415052d89c src/share/vm/classfile/javaClasses.cpp
        --- a/src/share/vm/classfile/javaClasses.cpp Tue Jun 24 12:27:51 2014 -0700
        +++ b/src/share/vm/classfile/javaClasses.cpp Thu Jun 26 16:45:58 2014 -0700
        @@ -791,6 +791,24 @@
         }
         
         
        +// Returns the Java name for this Java mirror (Resource allocated)
        +// See Klass::external_name().
        +// For primitive type Java mirrors, its type name is returned.
        +const char* java_lang_Class::as_external_name(oop java_class) {
        + assert(java_lang_Class::is_instance(java_class), "must be a Class object");
        + const char* name = NULL;
        + if (is_primitive(java_class)) {
        + name = type2name(primitive_type(java_class));
        + } else {
        + name = as_Klass(java_class)->external_name();
        + }
        + if (name == NULL) {
        + name = "<null>";
        + }
        + return name;
        +}
        +
        +
         Klass* java_lang_Class::array_klass(oop java_class) {
           Klass* k = ((Klass*)java_class->metadata_field(_array_klass_offset));
           assert(k == NULL || k->is_klass() && k->oop_is_array(), "should be array klass");
        diff -r 18415052d89c src/share/vm/classfile/javaClasses.hpp
        --- a/src/share/vm/classfile/javaClasses.hpp Tue Jun 24 12:27:51 2014 -0700
        +++ b/src/share/vm/classfile/javaClasses.hpp Thu Jun 26 16:45:58 2014 -0700
        @@ -270,7 +270,8 @@
             return result;
           }
           static Symbol* as_signature(oop java_class, bool intern_if_not_found, TRAPS);
        - static void print_signature(oop java_class, outputStream *st);
        + static void print_signature(oop java_class, outputStream* st);
        + static const char* as_external_name(oop java_class);
           // Testing
           static bool is_instance(oop obj) {
             return obj != NULL && obj->klass() == SystemDictionary::Class_klass();
        diff -r 18415052d89c src/share/vm/runtime/vframe.cpp
        --- a/src/share/vm/runtime/vframe.cpp Tue Jun 24 12:27:51 2014 -0700
        +++ b/src/share/vm/runtime/vframe.cpp Thu Jun 26 16:45:58 2014 -0700
        @@ -148,8 +148,7 @@
           if (obj.not_null()) {
             st->print("\t- %s <" INTPTR_FORMAT "> ", lock_state, (address)obj());
             if (obj->klass() == SystemDictionary::Class_klass()) {
        - Klass* target_klass = java_lang_Class::as_Klass(obj());
        - st->print_cr("(a java.lang.Class for %s)", InstanceKlass::cast(target_klass)->external_name());
        + st->print_cr("(a java.lang.Class for %s)", java_lang_Class::as_external_name(obj()));
             } else {
               Klass* k = obj->klass();
               st->print_cr("(a %s)", k->external_name());

          Attachments

            Issue Links

              Activity

                People

                • Assignee:
                  vkempik Vladimir Kempik
                  Reporter:
                  kmo Krystal Mo
                • Votes:
                  0 Vote for this issue
                  Watchers:
                  6 Start watching this issue

                  Dates

                  • Created:
                    Updated:
                    Resolved: