2015-09-22 13 views
5

sto lavorando su JVMTI agent e voglio identificare lo stesso thread sul metodo enter e exit. Sono in grado di ottenere il nome del thread, ma non è sufficiente.Come identificare univocamente thread in jvmti

Immaginate di avere un metodo come questo:

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

Quindi entrare in questo metodo avrà un nome e l'uscita questa discussione hanno nome diverso.

Quando si utilizza JVMTI come questo:

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

Ogni info riporterà nome diverso filo e voglio avere lo stesso identificatore per loro.

Come posso ottenere lo stesso identificatore per il thread?

Una soluzione può essere quella di ottenere il valore di campo del riferimento Thread (tid). Come si fa? Posso scorrere l'heap ma non riesco a ottenere il nome del campo.

+0

... c'è una domanda nascosta da qualche parte o hai semplicemente voglia di condividere le tue esperienze ?? – specializt

+0

Devi guardare il titolo. Ma di sicuro ho aggiunto delle domande all'articolo. – czs

+0

Questa non è una domanda, è una dichiarazione. Inoltre: escludendo completamente le tue domande effettive all'interno dei tuoi contenuti è garantito ottenere esattamente zero risposte. Questo non è un blog o forum di qualche tipo, le persone VOGLIONO aiutare, ma anche rifiutare di farlo se non riesci nemmeno a mettere insieme una semplice domanda .... la maggior parte delle volte – specializt

risposta

1

Una soluzione, come si è indicato, è quella di utilizzare GetFieldName. Questo richiede di cercare il jfieldid, che può essere davvero fastidioso.

Il modo in cui ho visto gli altri farlo è semplicemente assegnare i propri ID e riporli nella memoria locale del thread. Vedere JavaThreadLayer.cpp dal progetto TAU di UofO, in particolare la funzione JavaThreadLayer::GetThreadId().

+0

Sembra una soluzione. E che dire di usare 'pthread_self()' dato che il metodo di callback è (probabilmente) chiamato nello stesso thread? I miei primi test dimostrano che funziona come previsto. – czs

+0

Non riesco a capire perché non sarebbe una soluzione perfettamente ragionevole - uscendo da JVMTI i _think_ sarà sempre lo stesso thread - una sorta di requisito per supportare le architetture di debugger poiché è più che un po 'difficile all'introspezione stack asincrona ^^ – lscoughlin

1

ho finalmente trovato un altro semplice soulution:

Perché i callback di entrata/uscita sono in esecuzione nello stesso thread, è possibile utilizzare pthread_self() e gettalo via esempio a unsigned int. Non è lo stesso tid come puoi trovare in java, ma otterrai il numero univoco per il thread anche se il nome cambia.

Problemi correlati