RFR: 6830717: replay of compilations would help with debugging

Yumin Qi yumin.qi at oracle.com
Tue Oct 23 17:04:24 PDT 2012


Hi, Chris and all

   After permgen removal integration, the previous webrev (see 
http://cr.openjdk.java.net/~minqi/6830717) need changes according to 
metadata changes.

   Thanks for your comments

    http://cr.openjdk.java.net/~minqi/6830717.01

Thanks
Yumin

On 8/13/2012 5:02 PM, Christian Thalinger wrote:
> On Aug 6, 2012, at 2:40 PM, yumin.qi at 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


More information about the serviceability-dev mailing list