2017-02-20 7 views
0

응용 프로그램 내에서 예외가 발생할 때 응용 프로그램의 상태를 기록하려고합니다. 특히 메서드 로컬 변수 값 (원시 및 사용자 정의 모두)에 관심이 있습니까? ASM 5.1의 설명서를 읽었지만 값에 액세스 할 수있는 인터페이스를 찾을 수 없습니까? 거기에 ASM을 사용하지 않는다면 다른 인터페이스를 사용하면이 작업을 수행 할 수 있습니까? 솔루션은 응용 프로그램과 독립적이어야하며 플러그 앤 플레이 유형 솔루션이어야하며 Java 응용 프로그램에 플러그 할 수 있어야합니다. JNI를 사용하여ASM 라이브러리를 사용하는 메소드에서 메소드 변수 값과 사용자 정의 오브젝트 변수 값에 액세스하는 방법은 무엇입니까?

얻기 필드 IDS :

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

나는이 함수를 사용했는데 문제는 getlocalObject 함수를 사용하여 jobject를 얻었고,이 객체 내의 필드를 추출하는 방법을 알고 싶습니까? – kumarD

+0

@kumarD 1. 리플렉션 사용. Java 메소드를 호출하고 주어진'jobject'를 전달합니다. – apangin

+0

하지만 반사를 사용하려면 응용 프로그램 코드를 수정해야합니다. 나는 응용 프로그램 코드를 수정하고 싶지 않다. 응용 프로그램 코드와 독립적 인 솔루션을 원한다면 동적 BCI가 작동합니까? – kumarD