1
JVM TI _jclass의 이름을 얻는 방법은 무엇입니까? JVMTI 에이전트에로드 된 클래스의 이름을 표시하고 싶지만 _jclass 인스턴스에서 클래스 이름을 얻는 방법은 분명하지 않습니다.JVMTI _jclass toString
JVM TI _jclass의 이름을 얻는 방법은 무엇입니까? JVMTI 에이전트에로드 된 클래스의 이름을 표시하고 싶지만 _jclass 인스턴스에서 클래스 이름을 얻는 방법은 분명하지 않습니다.JVMTI _jclass toString
이게 원하는가요?
#include <stdlib.h>
#include "jvmti.h"
jvmtiEnv *globalJVMTIInterface;
void JNICALL vmInit(jvmtiEnv *jvmti_env,JNIEnv* jni_env,jthread thread) {
printf("VMStart\n");
jint numberOfClasses;
jclass *classes;
jint returnCode = (*globalJVMTIInterface)->GetLoadedClasses(globalJVMTIInterface, &numberOfClasses, &classes);
if (returnCode != JVMTI_ERROR_NONE) {
fprintf(stderr, "Unable to get a list of loaded classes (%d)\n", returnCode);
exit(-1);
}
int i;
for(i=0;i<numberOfClasses;i++) {
char* signature = NULL;
char* generic = NULL;
(*globalJVMTIInterface)->GetClassSignature(globalJVMTIInterface, classes[i], &signature, &generic);
printf("%d) %s %s\n", i+1, signature, generic);
if(signature) {
returnCode = (*globalJVMTIInterface)->Deallocate(globalJVMTIInterface, (unsigned char*) signature);
}
if(generic) {
returnCode = (*globalJVMTIInterface)->Deallocate(globalJVMTIInterface, (unsigned char*) generic);
}
}
if(classes) {
returnCode = (*globalJVMTIInterface)->Deallocate(globalJVMTIInterface, (unsigned char*) classes);
}
}
JNIEXPORT jint JNICALL Agent_OnLoad(JavaVM *jvm, char *options, void *reserved) {
jint returnCode = (*jvm)->GetEnv(jvm, (void **)&globalJVMTIInterface, JVMTI_VERSION_1_0);
if (returnCode != JNI_OK) {
fprintf(stderr, "The version of JVMTI requested (1.0) is not supported by this JVM.\n");
return JVMTI_ERROR_UNSUPPORTED_VERSION;
}
jvmtiEventCallbacks *eventCallbacks;
eventCallbacks = calloc(1, sizeof(jvmtiEventCallbacks));
if (!eventCallbacks) {
fprintf(stderr, "Unable to allocate memory\n");
return JVMTI_ERROR_OUT_OF_MEMORY;
}
eventCallbacks->VMInit = &vmInit;
returnCode = (*globalJVMTIInterface)->SetEventCallbacks(globalJVMTIInterface, eventCallbacks, (jint) sizeof(*eventCallbacks));
if (returnCode != JNI_OK) {
fprintf(stderr, "JVM does not have the required capabilities (%d)\n", returnCode);
exit(-1);
}
returnCode = (*globalJVMTIInterface)->SetEventNotificationMode(globalJVMTIInterface, JVMTI_ENABLE, JVMTI_EVENT_VM_INIT, (jthread) NULL);
if (returnCode != JNI_OK) {
fprintf(stderr, "JVM does not have the required capabilities, JVMTI_ENABLE, JVMTI_EVENT_VM_INIT (%d)\n", returnCode);
exit(-1);
}
return JVMTI_ERROR_NONE;
}
나는 당신이 그것을 GetClassSignature
에서 결정할 수 있다고 믿는다 (나는 그것을 시도하지 않았다).
어디에서이 코드를 가져 왔습니까? 아니면 직접 쓰셨습니까? JVMTI는 무엇을 사용하고 있습니까? – paweloque
나는 당신을 위해 그것을 빨리 썼다 ..... 나는 IBM을 위해 일하고 주로 내부 자바 프로파일 링 도구를 작성한다. 나는 C로 BCI 라이브러리를 작성했다 .... 사실 나는 이것을 다시 쓰려고한다. 올해는 아마 오픈 소스 .... 나는 "JVMTI"를 꽤 오랫동안 "살아왔다". 내가 도울 것이라고 생각했다. –
매우 흥미로운 소리! 라이브러리를 오픈 소스로 만들면 알려 주실 수 있습니까? 이 라이브러리를 다시 작성하는 데 도움이 필요하면 알려주세요! 내 이메일은 [email protected] – paweloque