Thu, 03 Oct 2013 18:53:27 -0400
8025238: nsk/jvmti/scenarios/bcinstr/BI04/bi04t002 crashed with SIGSEGV
Summary: Redefined class in stack trace may not be found by method_idnum so handle null.
Reviewed-by: sla, dcubed, sspitsyn
src/share/vm/classfile/javaClasses.cpp | file | annotate | diff | comparison | revisions | |
src/share/vm/prims/jvmtiRedefineClasses.cpp | file | annotate | diff | comparison | revisions |
1.1 --- a/src/share/vm/classfile/javaClasses.cpp Thu Oct 03 12:39:58 2013 +0400 1.2 +++ b/src/share/vm/classfile/javaClasses.cpp Thu Oct 03 18:53:27 2013 -0400 1.3 @@ -1376,8 +1376,15 @@ 1.4 const char* klass_name = holder->external_name(); 1.5 int buf_len = (int)strlen(klass_name); 1.6 1.7 - // pushing to the stack trace added one. 1.8 + // The method id may point to an obsolete method, can't get more stack information 1.9 Method* method = holder->method_with_idnum(method_id); 1.10 + if (method == NULL) { 1.11 + char* buf = NEW_RESOURCE_ARRAY(char, buf_len + 64); 1.12 + // This is what the java code prints in this case - added Redefined 1.13 + sprintf(buf, "\tat %s.null (Redefined)", klass_name); 1.14 + return buf; 1.15 + } 1.16 + 1.17 char* method_name = method->name()->as_C_string(); 1.18 buf_len += (int)strlen(method_name); 1.19 1.20 @@ -1773,7 +1780,8 @@ 1.21 return element; 1.22 } 1.23 1.24 -oop java_lang_StackTraceElement::create(Handle mirror, int method_id, int version, int bci, TRAPS) { 1.25 +oop java_lang_StackTraceElement::create(Handle mirror, int method_id, 1.26 + int version, int bci, TRAPS) { 1.27 // Allocate java.lang.StackTraceElement instance 1.28 Klass* k = SystemDictionary::StackTraceElement_klass(); 1.29 assert(k != NULL, "must be loaded in 1.4+"); 1.30 @@ -1790,8 +1798,16 @@ 1.31 oop classname = StringTable::intern((char*) str, CHECK_0); 1.32 java_lang_StackTraceElement::set_declaringClass(element(), classname); 1.33 1.34 + Method* method = holder->method_with_idnum(method_id); 1.35 + // Method on stack may be obsolete because it was redefined so cannot be 1.36 + // found by idnum. 1.37 + if (method == NULL) { 1.38 + // leave name and fileName null 1.39 + java_lang_StackTraceElement::set_lineNumber(element(), -1); 1.40 + return element(); 1.41 + } 1.42 + 1.43 // Fill in method name 1.44 - Method* method = holder->method_with_idnum(method_id); 1.45 oop methodname = StringTable::intern(method->name(), CHECK_0); 1.46 java_lang_StackTraceElement::set_methodName(element(), methodname); 1.47
2.1 --- a/src/share/vm/prims/jvmtiRedefineClasses.cpp Thu Oct 03 12:39:58 2013 +0400 2.2 +++ b/src/share/vm/prims/jvmtiRedefineClasses.cpp Thu Oct 03 18:53:27 2013 -0400 2.3 @@ -2931,7 +2931,8 @@ 2.4 old_method->set_is_obsolete(); 2.5 obsolete_count++; 2.6 2.7 - // obsolete methods need a unique idnum 2.8 + // obsolete methods need a unique idnum so they become new entries in 2.9 + // the jmethodID cache in InstanceKlass 2.10 u2 num = InstanceKlass::cast(_the_class_oop)->next_method_idnum(); 2.11 if (num != ConstMethod::UNSET_IDNUM) { 2.12 old_method->set_method_idnum(num);