【发布时间】:2017-02-20 12:14:56
【问题描述】:
我正在尝试在应用程序中发生异常时记录应用程序的状态,我对方法局部变量值(原始和用户定义)特别感兴趣?我已经浏览了 ASM 5.1 的文档,但是我找不到任何可以让我访问这些值的接口?有没有办法做到这一点,如果不使用 ASM 是否有任何其他接口可以让我这样做?该解决方案应该独立于应用程序,它应该是一个即插即用型解决方案,使用它我应该能够将其插入任何 Java 应用程序。
使用 JNI 获取字段 ID:
char *klazName;
error = (*jvmti)->GetLocalObject(jvmti, thread, i,
table_ptr[j].slot, &value_ptr);
check_jvmti_error(jvmti, error,
"Cannot Get Local Variable Object");
if(!error){
klaz = (*env)->GetObjectClass(env,value_ptr);
error = (*jvmti)->GetClassSignature(jvmti, klaz,
&klazName, NULL);
if(strstr(klazName,"String")!=NULL){
printf("...%s\n",klazName);
field = (*env)->GetFieldID(env,declaring_class_ptr,table_ptr[j].name,"S");
value = (jstring)(*env)->GetObjectField(env,value_ptr,field);
stringVal = (*env)->GetStringUTFChars(env,value,0);
printf("Value of Field %s is .\n", stringVal);
【问题讨论】:
标签: jvm java-native-interface java-bytecode-asm jvmti