jvmti

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

तो इस विधि में प्रवेश एक नाम होगा और इस थ्रेड बाहर निकलने अलग नाम है।

इस तरह 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 अलग धागा नाम रिपोर्ट करेंगे और मैं उनके लिए एक ही पहचानकर्ता करना चाहते हैं।

मैं थ्रेड के लिए समान पहचानकर्ता कैसे प्राप्त कर सकता हूं?

एक समाधान संदर्भित Thread (tid) के फील्ड मान प्राप्त करने के लिए हो सकता है। यह कैसे करें? मैं ढेर के माध्यम से फिर से शुरू कर सकता हूं लेकिन मुझे फ़ील्ड का नाम नहीं मिल सकता है।

+0

... क्या कोई प्रश्न कहीं छिपा हुआ है या क्या आप बस अपने अनुभव साझा करना चाहते हैं ?? – specializt

+0

आपको शीर्षक को देखना होगा। लेकिन निश्चित रूप से मैंने लेख में प्रश्न जोड़े। – czs

+0

कोई सवाल नहीं है, यह एक बयान है। इसके अलावा: आपकी सामग्री के अंदर अपने वास्तविक प्रश्नों को पूरी तरह से बाहर करने के लिए आपको बिल्कुल शून्य उत्तर प्राप्त करने की गारंटी है। यह किसी प्रकार का ब्लॉग या फोरम नहीं है, लोग मदद करना चाहते हैं लेकिन ऐसा करने से इनकार करते हैं यदि आप एक साधारण प्रश्न भी इकट्ठा नहीं कर सकते हैं .... अधिकांश समय – specializt

उत्तर

1

एक समाधान, जैसा कि आपने बताया है, GetFieldName का उपयोग करना होगा। इसके लिए आपको jfieldid को देखने की आवश्यकता है, जो वास्तव में परेशान हो सकता है।

जिस तरह से मैंने दूसरों को यह देखा है, बस अपनी आईडी को असाइन करना और थ्रेड स्थानीय भंडारण में इसे छीनना है। यूओएफओ की टीएयू परियोजना से विशेष रूप से JavaThreadLayer::GetThreadId() फ़ंक्शन से JavaThreadLayer.cpp देखें।

+0

यह एक समाधान की तरह लगता है। और 'pthread_self() 'का उपयोग करने के बारे में क्या है क्योंकि कॉलबैक विधि (संभवतः) एक ही धागे में बुलाया जाता है? मेरे शुरुआती परीक्षण से पता चलता है कि यह अपेक्षा के अनुसार काम करता है। – czs

+0

मैं नहीं देख सकता कि यह एक बिल्कुल उचित समाधान क्यों नहीं होगा - JVMTI से बाहर आ रहा है ithink_ यह _always_ एक ही धागा होगा - डीबगर आर्किटेक्चर का समर्थन करने के लिए एक आवश्यकता की तरह, क्योंकि यह थोड़ा कठिन है एसिंक्रोनस स्टैक आत्मनिरीक्षण ^^ के लिए – lscoughlin

1

मैं अंत में एक और सरल soulution पाया:

क्योंकि प्रवेश/बाहर निकलें कॉलबैक एक ही धागे में चल रहे हैं, यह pthread_self() उपयोग करें और यह जैसे कास्ट करने के लिए संभव है unsigned int पर। यह tid जैसा नहीं है जैसा कि आप जावा में पा सकते हैं, लेकिन आपको धागे के लिए अद्वितीय संख्या मिल जाएगी हालांकि नाम बदलता है।

संबंधित मुद्दे