2017-02-20 56 views
0

我想在應用程序中發生異常時記錄應用程序的狀態,我特別感興趣的方法局部變量值(雙方原始和用戶定義)?我已經閱讀了ASM 5.1的文檔,但是我找不到可以讓我訪問這些值的任何接口?有沒有辦法做到這一點,如果不使用ASM是否有任何其他接口,讓我這樣做?該解決方案應該獨立於應用程序,它應該是即插即用型解決方案,使用它我應該能夠將其插入任何Java應用程序。使用JNI如何在使用ASM庫的方法中訪問用戶定義對象變量的方法變量值和值?

獲取字段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); 

回答

0

JVM TI GetLocal*功能應該有所幫助。

+0

我已經使用這些函數,問題是我得到一個jobject使用getlocalObject函數,我想知道如何提取該對象內的字段? – kumarD

+0

@kumarD 1.使用反射。調用Java方法並將給定的'jobject'傳遞給它。 – apangin

+0

但爲了使用反射我將不得不修改應用程序代碼嗎?我不想修改應用程序代碼。我想要一個獨立於應用程序代碼的解決方案,動態BCI能夠工作嗎? – kumarD