2015-09-22 4 views
5

JVMTIエージェントで作業しています。メソッドの入力と終了で同じスレッドを識別したいと思います。私はスレッド名を得ることができますが、それは十分ではありません。jvmtiのスレッドを一意に識別する方法

あなたは、このようなメソッドを持っている想像:

public class Main { 
    public static void myMethod() { 
     System.out.println("doing something as " + Thread.currentThread().getName()); 
     Thread.currentThread().setName("SomethingDifferent"); 
     System.out.println("doing something as same thread " + Thread.currentThread().getName()); 
    } 
} 

だからこの方法は、1名を持っています入ると、このスレッドを終了するには、別の名前を持っています。このようJVMTIを使用している場合

static void JNICALL callback_on_method_entry(jvmtiEnv *jvmti, JNIEnv* env, 
    jthread thread, jmethodID method) 
{ 
    ... 
    (*jvmti)->GetThreadInfo(jvmti, thread, &info); 
    ... 
} 

static void JNICALL callback_on_method_exit(jvmtiEnv *jvmti, JNIEnv *env, jthread thread, jmethodID method, jboolean was_popped_by_exception, jvalue return_value) 
{ 
    ... 
    (*jvmti)->GetThreadInfo(jvmti, thread, &info); 
    ... 
} 

infoは異なるスレッド名を報告し、私は彼らのために同じ識別子を持っていると思います。

スレッドに対して同じ識別子を取得するにはどうすればよいですか?

フィールド値を参照するThreadtid)にすることができます。 どうすればいいですか?私はヒープを通ってiteratすることができますが、私はフィールド名を取得することはできません。

+0

...どこかに隠された質問がありますか、単にあなたの経験を共有したいですか? – specializt

+0

タイトルを見なければなりません。しかし確かに私は記事に質問を追加しました。 – czs

+0

これは問題ではなく、そのa文です。プラス:あなたのコンテンツの中にあなたの実際の質問を完全に排除すると、あなたは全くゼロの答えを得ることが保証されます。これは何らかのブログやフォーラムではなく、人々は助けたいと思っていますが、単純な質問を組み立てることができない場合でもそうすることを拒否しています....ほとんどの場合 – specializt

答えて

1

1つの解決策は、あなたが指摘したように、GetFieldNameを使用することです。それは本当に迷惑になることがありますjfieldidを検索する必要があります。

他の人が見たことは、自分のIDを割り当ててスレッドのローカルストレージに隠すことです。 UofOのTAUプロジェクトのJavaThreadLayer.cpp、具体的にはJavaThreadLayer::GetThreadId()の機能を参照してください。

+0

それは解決策のようです。また、コールバックメソッドが(おそらく)同じスレッドで呼び出されているので、 'pthread_self()'を使うのはどうですか?私の初期のテストは、期待どおりに動作することを示しています。 – czs

+0

私はそれが完全に合理的な解決策ではない理由を知ることができません - JVMTIから出てきます_think_それは同じスレッド - デバッガアーキテクチャをサポートする要件の並べ替えです。非同期スタックイントロスペクションへ^^ – lscoughlin

1

私は最終的に別の簡単なsoulutionが見つかりました:入口/出口コールバックが同じスレッドで実行されている、それはpthread_self()を使用して、例えば、それをキャストすることが可能ですので

unsigned int。 Javaで見つけられるのと同じではないtidですが、名前は変わりますが、スレッドの一意の番号を取得します。

関連する問題