565 CHECK_FAIL(err);
566 signatureSymbol &= (~1); // remove metadata lsb
567 err = ps_pread(J->P, signatureSymbol + OFFSET_Symbol_length, &signatureSymbolLength, 2);
568 CHECK_FAIL(err);
569 signatureString = (char*)calloc(signatureSymbolLength + 1, 1);
570 err = ps_pread(J->P, signatureSymbol + OFFSET_Symbol_body, signatureString, signatureSymbolLength);
571 CHECK_FAIL(err);
572
573 /* To get klass string */
574 err = read_pointer(J, constantPool + OFFSET_ConstantPool_pool_holder, &klassPtr);
575 CHECK_FAIL(err);
576 err = read_pointer(J, klassPtr + OFFSET_Klass_name, &klassSymbol);
577 CHECK_FAIL(err);
578 err = ps_pread(J->P, klassSymbol + OFFSET_Symbol_length, &klassSymbolLength, 2);
579 CHECK_FAIL(err);
580 klassString = (char*)calloc(klassSymbolLength + 1, 1);
581 err = ps_pread(J->P, klassSymbol + OFFSET_Symbol_body, klassString, klassSymbolLength);
582 CHECK_FAIL(err);
583
584 result[0] = '\0';
585 strncat(result, klassString, size);
586 size -= strlen(klassString);
587 strncat(result, ".", size);
588 size -= 1;
589 strncat(result, nameString, size);
590 size -= strlen(nameString);
591 strncat(result, signatureString, size);
592
593 if (nameString != NULL) free(nameString);
594 if (klassString != NULL) free(klassString);
595 if (signatureString != NULL) free(signatureString);
596
597 return PS_OK;
598
599 fail:
600 if (debug) {
601 fprintf(stderr, "name_for_methodPtr: FAIL \n\n");
602 }
603 if (nameString != NULL) free(nameString);
604 if (klassString != NULL) free(klassString);
605 if (signatureString != NULL) free(signatureString);
606 return -1;
607 }
608
609 static int nmethod_info(Nmethod_t *N)
610 {
611 jvm_agent_t *J = N->J;
1078 CHECK_FAIL(err);
1079
1080 if (N->pc_desc > 0) {
1081 jframe->locinf = 1;
1082 err = scopeDesc_chain(N);
1083 CHECK_FAIL(err);
1084 }
1085 result[0] = COMP_METHOD_SIGN;
1086 vf = &N->vframes[0];
1087 if (N->vf_cnt > 0) {
1088 jframe->vf_cnt = N->vf_cnt;
1089 jframe->bci = vf->bci;
1090 jframe->line = vf->line;
1091 err = name_for_methodPtr(J, N->vframes[0].method, result+1, size-1);
1092 CHECK_FAIL(err);
1093 } else {
1094 err = name_for_methodPtr(J, method, result+1, size-1);
1095 CHECK_FAIL(err);
1096 }
1097 if (deoptimized) {
1098 strncat(result + 1, " [deoptimized frame]; ", size-1);
1099 } else {
1100 strncat(result + 1, " [compiled] ", size-1);
1101 }
1102 if (debug)
1103 fprintf(stderr, "name_for_nmethod: END: method name: %s, vf_cnt: %d\n\n",
1104 result, N->vf_cnt);
1105 return PS_OK;
1106
1107 fail:
1108 if (debug)
1109 fprintf(stderr, "name_for_nmethod: FAIL \n\n");
1110 return err;
1111 }
1112
1113 static int
1114 name_for_imethod(jvm_agent_t* J,
1115 uint64_t bcp,
1116 uint64_t method,
1117 char *result,
1118 size_t size,
1119 Jframe_t *jframe
1120 ) {
|
565 CHECK_FAIL(err);
566 signatureSymbol &= (~1); // remove metadata lsb
567 err = ps_pread(J->P, signatureSymbol + OFFSET_Symbol_length, &signatureSymbolLength, 2);
568 CHECK_FAIL(err);
569 signatureString = (char*)calloc(signatureSymbolLength + 1, 1);
570 err = ps_pread(J->P, signatureSymbol + OFFSET_Symbol_body, signatureString, signatureSymbolLength);
571 CHECK_FAIL(err);
572
573 /* To get klass string */
574 err = read_pointer(J, constantPool + OFFSET_ConstantPool_pool_holder, &klassPtr);
575 CHECK_FAIL(err);
576 err = read_pointer(J, klassPtr + OFFSET_Klass_name, &klassSymbol);
577 CHECK_FAIL(err);
578 err = ps_pread(J->P, klassSymbol + OFFSET_Symbol_length, &klassSymbolLength, 2);
579 CHECK_FAIL(err);
580 klassString = (char*)calloc(klassSymbolLength + 1, 1);
581 err = ps_pread(J->P, klassSymbol + OFFSET_Symbol_body, klassString, klassSymbolLength);
582 CHECK_FAIL(err);
583
584 result[0] = '\0';
585 if (snprintf(result, size,
586 "%s.%s%s",
587 klassString,
588 nameString,
589 signatureString) >= size) {
590 // truncation
591 goto fail;
592 }
593
594 if (nameString != NULL) free(nameString);
595 if (klassString != NULL) free(klassString);
596 if (signatureString != NULL) free(signatureString);
597
598 return PS_OK;
599
600 fail:
601 if (debug) {
602 fprintf(stderr, "name_for_methodPtr: FAIL \n\n");
603 }
604 if (nameString != NULL) free(nameString);
605 if (klassString != NULL) free(klassString);
606 if (signatureString != NULL) free(signatureString);
607 return -1;
608 }
609
610 static int nmethod_info(Nmethod_t *N)
611 {
612 jvm_agent_t *J = N->J;
1079 CHECK_FAIL(err);
1080
1081 if (N->pc_desc > 0) {
1082 jframe->locinf = 1;
1083 err = scopeDesc_chain(N);
1084 CHECK_FAIL(err);
1085 }
1086 result[0] = COMP_METHOD_SIGN;
1087 vf = &N->vframes[0];
1088 if (N->vf_cnt > 0) {
1089 jframe->vf_cnt = N->vf_cnt;
1090 jframe->bci = vf->bci;
1091 jframe->line = vf->line;
1092 err = name_for_methodPtr(J, N->vframes[0].method, result+1, size-1);
1093 CHECK_FAIL(err);
1094 } else {
1095 err = name_for_methodPtr(J, method, result+1, size-1);
1096 CHECK_FAIL(err);
1097 }
1098 if (deoptimized) {
1099 strncat(result, " [deoptimized frame]; ", size - strlen(result) - 1);
1100 } else {
1101 strncat(result, " [compiled] ", size - strlen(result) - 1);
1102 }
1103 if (debug)
1104 fprintf(stderr, "name_for_nmethod: END: method name: %s, vf_cnt: %d\n\n",
1105 result, N->vf_cnt);
1106 return PS_OK;
1107
1108 fail:
1109 if (debug)
1110 fprintf(stderr, "name_for_nmethod: FAIL \n\n");
1111 return err;
1112 }
1113
1114 static int
1115 name_for_imethod(jvm_agent_t* J,
1116 uint64_t bcp,
1117 uint64_t method,
1118 char *result,
1119 size_t size,
1120 Jframe_t *jframe
1121 ) {
|