2015-09-22 9 views
5

Pracuję na agencie JVMTI i chcę zidentyfikować ten sam wątek przy wchodzeniu i wychodzeniu z metody. Mogę uzyskać nazwę wątku, ale to nie wystarcza.Jak jednoznacznie identyfikować wątek w jvmti

Wyobraź sobie, że metody takie jak to:

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

Więc wprowadzenie tej metody mają jedną nazwę i wychodzenie ten wątek mieć inną nazwę.

Podczas korzystania JVMTI tak:

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

Każdy info zgłosi inną nazwę wątku i chcę mieć taki sam identyfikator dla nich.

Jak mogę uzyskać ten sam identyfikator dla wątku?

Jednym z rozwiązań może być uzyskanie wartości pola z odniesieniem Thread (tid). Jak to zrobić? Potrafię przeglądać stertę, ale nie mogę uzyskać nazwy pola.

+0

... czy jest jakieś pytanie ukryte gdzieś, czy po prostu chcesz podzielić się swoimi doświadczeniami? – specializt

+0

Musisz spojrzeć na tytuł. Ale na pewno dodałem pytania do artykułu. – czs

+0

To nie jest pytanie, to oświadczenie. Plus: całkowite wykluczenie twoich prawdziwych pytań w twoich treściach gwarantuje uzyskanie dokładnie zero odpowiedzi. To nie jest blog lub forum jakiegoś rodzaju, ludzie CHCĄ pomagać, ale też nie chcą tego robić, jeśli nie potrafisz nawet postawić prostego pytania .... przez większość czasu – specializt

Odpowiedz

1

Jednym z rozwiązań, jak zauważyłeś, byłoby użycie GetFieldName. To wymaga od ciebie wyszukiwania jfieldida, co może być naprawdę denerwujące.

Sposób, w jaki widziałem to inni, polega po prostu na przypisaniu własnego identyfikatora i przechowywaniu go w lokalnej pamięci wątku. Zobacz JavaThreadLayer.cpp z projektu TAU UofO, w szczególności z funkcji JavaThreadLayer::GetThreadId().

+0

To wydaje się rozwiązaniem. A co powiesz na użycie 'pthread_self()', ponieważ metoda wywołania zwrotnego jest (prawdopodobnie) wywoływana w tym samym wątku? Moje wczesne testy pokazują, że działa zgodnie z oczekiwaniami. – czs

+0

Nie rozumiem, dlaczego nie byłoby to również całkowicie rozsądne rozwiązanie - wychodząc z JVMTI i ... myślę, że zawsze będzie to ten sam wątek - coś w rodzaju wymogu wspierania architektur debuggera, ponieważ jest to trochę trudniejsze do asynchronicznej introspekcji stosów ^^ – lscoughlin

1

końcu znaleźć inny prosty Soulution:

Ponieważ callbacki wejścia/wyjścia są wyświetlane w tym samym wątku, to można stosować pthread_self() i oddać ją np do unsigned int. To nie jest to samo, co można znaleźć w Javie, ale otrzymasz unikalny numer dla wątku, chociaż nazwa zmienia się.

Powiązane problemy