如何使用ASM库访问方法内的用户定义的对象变量的方法变量值和值?

时间:2017-02-20 12:14:57

标签: jvm java-native-interface java-bytecode-asm jvmti

我试图在应用程序中发生异常时记录应用程序的状态,我特别感兴趣的是方法局部变量值(原始和用户定义)?我已经阅读了ASM 5.1的文档,但是我找不到任何可以访问这些值的接口?有没有办法做到这一点,如果不使用ASM是否有任何其他接口可以让我这样做?解决方案应该独立于应用程序,它应该是即插即用型解决方案,使用它我应该能够将其插入任何Java应用程序。

使用JNI获取Field 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);

1 个答案:

答案 0 :(得分:0)

JVM TI GetLocal*功能应该有所帮助。