2017-02-20 7 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

私はこれらの関数を使っていますが、問題はgetl​​ocalObject関数を使ってjobjectを取得することです。このオブジェクト内のフィールドを抽出する方法を知りたいのですか? – kumarD

+0

@kumarD 1.反射を使用する。 Javaメソッドを呼び出し、指定された 'jobject'を渡します。 – apangin

+0

しかし、反射を使用するには、アプリケーションコードを正しく変更する必要がありますか?私はアプリケーションコードを変更したくありません。私はアプリケーションコードとは独立したソリューションを望んでいますが、動的BCIは機能しますか? – kumarD

関連する問題