On Aug 6, 2012, at 2:40 PM, yumin...@oracle.com wrote:
Hi,
Please give your comments of the changes about
6830717: replay of compilations would help with debugging.
http://monaco.sfbay.sun.com/detail.jsf?cr=6830717
Sometime jvm crashes in the process of compilation or in compiled method. To
reproduce the compilation process in debug JVM is helpful for quickly
identifying root cause.
To do recompilation, we collect data by using of SA (Serviceability Agent) to
extract application and system class data from core file. Those information
includes nmethod, methodOop, methodDataOop, instanceKlass and corresponding ci
counterparts.
With reconfiguring similar (not exactly same) compiling environment as in the
core file, try to compile again the failed java methods.
contributed by Tom R (never). webrev:
http://cr.openjdk.java.net/~minqi/6830717/<http://cr.openjdk.java.net/%7Eminqi/6830717/>
src/share/vm/ci/ciReplay.cpp:
603 if (strcmp(field_signature, "[B") == 0) {
604 oop value = oopFactory::new_byteArray(length, CHECK);
605 java_mirror->obj_field_put(fd.offset(), value);
606 } else if (strcmp(field_signature, "[Z") == 0) {
607 oop value = oopFactory::new_boolArray(length, CHECK);
608 java_mirror->obj_field_put(fd.offset(), value);
609 } else if (strcmp(field_signature, "[C") == 0) {
610 oop value = oopFactory::new_charArray(length, CHECK);
611 java_mirror->obj_field_put(fd.offset(), value);
612 } else if (strcmp(field_signature, "[S") == 0) {
613 oop value = oopFactory::new_shortArray(length, CHECK);
614 java_mirror->obj_field_put(fd.offset(), value);
615 } else if (strcmp(field_signature, "[F") == 0) {
616 oop value = oopFactory::new_singleArray(length, CHECK);
617 java_mirror->obj_field_put(fd.offset(), value);
618 } else if (strcmp(field_signature, "[D") == 0) {
619 oop value = oopFactory::new_doubleArray(length, CHECK);
620 java_mirror->obj_field_put(fd.offset(), value);
621 } else if (strcmp(field_signature, "[I") == 0) {
622 oop value = oopFactory::new_intArray(length, CHECK);
623 java_mirror->obj_field_put(fd.offset(), value);
624 } else if (strcmp(field_signature, "[J") == 0) {
625 oop value = oopFactory::new_longArray(length, CHECK);
626 java_mirror->obj_field_put(fd.offset(), value);
627 } else if (field_signature[0] == '['&& field_signature[1] ==
'L') {
Can't we switch on the second character? And move this call:
630 java_mirror->obj_field_put(fd.offset(), value);
out of the switch?
637 if (strcmp(field_signature, "I") == 0) {
638 int value = atoi(string_value);
639 java_mirror->int_field_put(fd.offset(), value);
640 } else if (strcmp(field_signature, "B") == 0) {
641 int value = atoi(string_value);
642 java_mirror->byte_field_put(fd.offset(), value);
643 } else if (strcmp(field_signature, "C") == 0) {
644 int value = atoi(string_value);
645 java_mirror->char_field_put(fd.offset(), value);
646 } else if (strcmp(field_signature, "S") == 0) {
647 int value = atoi(string_value);
648 java_mirror->short_field_put(fd.offset(), value);
649 } else if (strcmp(field_signature, "Z") == 0) {
650 int value = atol(string_value);
651 java_mirror->bool_field_put(fd.offset(), value);
652 } else if (strcmp(field_signature, "J") == 0) {
653 jlong value;
654 if (sscanf(string_value, INT64_FORMAT,&value) != 1) {
655 fprintf(stderr, "Error parsing long: %s\n", string_value);
656 return;
657 }
658 java_mirror->long_field_put(fd.offset(), value);
659 } else if (strcmp(field_signature, "F") == 0) {
660 float value = atof(string_value);
661 java_mirror->float_field_put(fd.offset(), value);
662 } else if (strcmp(field_signature, "D") == 0) {
663 double value = atof(string_value);
664 java_mirror->double_field_put(fd.offset(), value);
665 } else if (strcmp(field_signature, "Ljava/lang/String;") == 0) {
666 Handle value = java_lang_String::create_from_str(string_value,
CHECK);
667 java_mirror->obj_field_put(fd.offset(), value());
668 } else if (field_signature[0] == 'L') {
Same here (not the put though)?
Otherwise it looks good.
-- Chris
Thanks
Yumin