【问题标题】:How to access method variable values and values of User defined object variables inside a method using ASM library?如何使用 ASM 库访问方法内的方法变量值和用户定义的对象变量的值?
【发布时间】: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


    【解决方案1】:

    JVM TI GetLocal* 函数应该会有所帮助。

    【讨论】:

    • 我已经使用了这些函数,问题是我使用 getlocalObject 函数得到了一个作业,我想知道如何提取这个对象中的字段?
    • @kumarD 1. 使用反射。调用 Java 方法并将给定的jobject 传递给它。
    • 但为了使用反射,我必须修改应用程序代码,对吧?我不想修改应用程序代码。我想要一个独立于应用程序代码的解决方案,动态 BCI 可以工作吗?
    • @kumarD 不一定。如果需要,您的 JVM TI 代理可能会加载辅助 Java 类。
    • 2.另一种方法是使用 JNI Get*Field 函数。拨打GetObjectClass+GetClassFields获取jfieldIDs
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-10
    • 2011-01-01
    • 1970-01-01
    相关资源
    最近更新 更多