2015-09-22 9 views
5

Ich arbeite an JVMTI-Agent und ich möchte den gleichen Thread auf Methode eingeben und beenden. Ich kann einen Thread-Namen erhalten, aber das ist nicht ausreichend.Wie eindeutig Thread in jvmti identifizieren

Stellen Sie sich vor, ein Verfahren wie dieses:

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()); 
    } 
} 

diese Methode So Eingabe wird einen Namen haben und diesen Thread verlass anderen Namen.

Wenn JVMTI wie folgt aus:

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); 
    ... 
} 

Jeder info anderen Thread Name berichten, und ich will für sie die gleiche Kennung haben.

Wie bekomme ich die gleiche Kennung für den Thread?

Eine Lösung kann sein, Feldwert des referenzierten Thread (tid) zu erhalten. Wie geht das? Ich kann durch den Heap iterieren, aber ich kann den Feldnamen nicht erhalten.

+0

... ist irgendwo eine Frage versteckt oder wollten Sie einfach Ihre Erfahrungen teilen? – specializt

+0

Sie müssen sich den Titel ansehen. Aber sicher habe ich Fragen in den Artikel eingefügt. – czs

+0

Das ist keine Frage, es ist eine Aussage. Plus: Das vollständige Ausschließen Ihrer tatsächlichen Fragen in Ihren Inhalten garantiert Ihnen garantiert genau null Antworten. Dies ist kein Blog oder Forum irgendeiner Art, die Leute WOLLEN helfen, aber auch ablehnen, dies zu tun, wenn Sie nicht einmal eine einfache Frage zusammenstellen können .... die meiste Zeit – specializt

Antwort

1

Eine Lösung, wie Sie darauf hingewiesen haben, wäre die Verwendung von GetFieldName. Das erfordert, dass Sie das jfieldid nachschlagen, was sehr nervig sein kann.

Die Art, wie ich andere gesehen habe, besteht darin, einfach ihre eigenen IDs zuzuordnen und sie im lokalen Speicher des Threads zu speichern. Siehe JavaThreadLayer.cpp von UofOs TAU-Projekt, speziell die JavaThreadLayer::GetThreadId()-Funktion.

+0

Das scheint wie eine Lösung. Und was ist mit 'pthread_self()' zu tun, da die Callback-Methode (wahrscheinlich) im selben Thread aufgerufen wird? Meine frühen Tests zeigen, dass es wie erwartet funktioniert. – czs

+0

Ich kann nicht verstehen, warum das nicht auch eine vollkommen vernünftige Lösung wäre - aus JVMTI kommend, wird es immer der gleiche Thread sein - eine Art Anforderung zur Unterstützung von Debugger-Architekturen, da es mehr als ein bisschen schwierig ist zur asynchronen Stack-Introspektion ^^ – lscoughlin

1

Schließlich fand ich ein weiteres einfaches soulution:

Da die Eingangs-/Ausgangs-Rückrufe in demselben Thread ausgeführt werden, ist es möglich zu verwenden und pthread_self() gegossen es z.B. zu unsigned int. Es ist nicht das gleiche tid wie Sie in Java finden können, aber Sie erhalten die eindeutige Nummer für Thread, obwohl der Name ändert.

Verwandte Themen