2009-05-25 14 views
15

मैं Win32 थ्रेड पर एक नाम कैसे सेट करूं? मुझे इसे प्राप्त करने के लिए कोई Win32 API नहीं मिला। असल में मैं लॉग फ़ाइल में थ्रेड नाम जोड़ना चाहता हूं। क्या टीएलएस (थ्रेड लोकल स्टोरेज) ऐसा करने का एकमात्र तरीका है?नाम को Win32 थ्रेड में कैसे सेट करें?

+0

SetThreadDescription() API है , आगे बढ़ना, एपीआई जिसके द्वारा माइक्रोसॉफ्ट इसका समर्थन करेगा। अधिक जानकारी के लिए, यह उत्तर देखें: http://stackoverflow.com/a/43787005/434413 –

उत्तर

1

आप हमेशा इस जानकारी को एक उपयुक्त डेटा संरचना में स्टोर कर सकते हैं। इस नाम पर GetThreadId() को मानचित्र बनाने के लिए हैश या मानचित्र का उपयोग करें। चूंकि GetThreadId() हमेशा एक अद्वितीय पहचानकर्ता होता है, यह ठीक काम करता है।

चीयर्स!

बेशक

, अगर वह कई धागे बनाने है, कि hashmap धीरे को भरने और का उपयोग अधिक से अधिक स्मृति, इसलिए कुछ सफाई प्रक्रिया शायद एक अच्छी चीज के रूप में अच्छी तरह से है होगा।

आप बिल्कुल सही हैं। जब एक धागा मर जाता है, तो मानचित्र में इसी प्रविष्टि को स्वाभाविक रूप से हटा दिया जाना चाहिए।

+0

बेशक, यदि वह कई धागे बना रहा है, तो हैशप धीरे-धीरे भर जाएगा और अधिक से अधिक स्मृति का उपयोग करेगा, इसलिए कुछ सफाई प्रक्रिया शायद एक अच्छी बात भी है। –

+0

डाउनवॉटिंग क्योंकि मुझे भी इस सवाल का जवाब चाहिए, लेकिन मुझे वास्तव में प्रोफाइलिंग कारणों के लिए थ्रेड में नाम सेट करने की आवश्यकता है। आपका उत्तर पूछा गया प्रश्न का उत्तर नहीं देता है: पी –

29

क्या इससे मदद मिलती है? How to: Set a Thread Name in Native Code

प्रबंधित कोड में, यह संबंधित थ्रेड ऑब्जेक्ट की नाम संपत्ति को सेट करना जितना आसान है।

+1

मुझे लगता है कि थ्रेड नाम प्रदर्शित करने के लिए केवल विजुअल स्टूडियो डीबगर के लिए इसका अनुमान है। – Canopus

+1

अन्य डिबगर्स ने उसी सिग्नल –

+3

के अनुरूप और जवाब दिया है http://thetweaker.wordpress.com/2009/04/10/naming-threads/ नोट्स के रूप में, वे सभी डीबगर डेटा संरचना में थ्रेड नाम संग्रहीत करके ऐसा करते हैं । एर्गो, डीबगर के बिना नाम संग्रहित नहीं किया जाएगा, और लॉगिंग उद्देश्यों के लिए उपलब्ध नहीं होगा। गंदा बग भी: जब आप इसे डीबग करने का प्रयास करते हैं, तो यह अचानक फिर से काम करता है। – MSalters

1

आप डीबगर (windbg या दृश्य स्टूडियो) में अपने सूत्र के नाम देखना चाहते हैं: http://blogs.msdn.com/stevejs/archive/2005/12/19/505815.aspx

मैं वास्तव में यकीन नहीं है वहाँ अगर धागा नाम पाने के लिए एक रिवर्स विधि। लेकिन टीएलएस जाने के रास्ते की तरह लगता है।

+0

आपको गलत इंप्रेशन मिला है। थ्रेड का नाम ** ** ** धागे से संग्रहीत नहीं है। यह केवल डीबगर में संग्रहीत है, और इसके परिणामस्वरूप केवल तभी मौजूद होता है जब एक डीबगर संलग्न होता है। डीबगर के बिना, अपवाद केवल निम्नलिखित अपवाद फ़िल्टर में चला जाता है, जो कि कुछ भी नहीं हुआ है। जब डीबगर के तहत एप्लिकेशन नहीं चलाया जाता है तो थ्रेड नाम खो जाता है। – IInspectable

17

http://msdn.microsoft.com/en-us/library/xcb2z8hs(VS.90).aspx

// 
// Usage: SetThreadName (-1, "MainThread"); 
// 
#include <windows.h> 
const DWORD MS_VC_EXCEPTION=0x406D1388; 

#pragma pack(push,8) 
typedef struct tagTHREADNAME_INFO 
{ 
    DWORD dwType; // Must be 0x1000. 
    LPCSTR szName; // Pointer to name (in user addr space). 
    DWORD dwThreadID; // Thread ID (-1=caller thread). 
    DWORD dwFlags; // Reserved for future use, must be zero. 
} THREADNAME_INFO; 
#pragma pack(pop) 

void SetThreadName(DWORD dwThreadID, char* threadName) 
{ 
    THREADNAME_INFO info; 
    info.dwType = 0x1000; 
    info.szName = threadName; 
    info.dwThreadID = dwThreadID; 
    info.dwFlags = 0; 

    __try 
    { 
     RaiseException(MS_VC_EXCEPTION, 0, sizeof(info)/sizeof(ULONG_PTR),  (ULONG_PTR*)&info); 
    } 
    __except(EXCEPTION_EXECUTE_HANDLER) 
    { 
    } 
} 
+0

यह तब तक काम नहीं करेगा जब तक कि आप डीबगर के तहत कोड नहीं चलाते। यह निश्चित रूप से लाइव सिस्टम में थ्रेड के नाम को लॉग करने के लिए उपयोग नहीं किया जा सकता है। – IInspectable

9

Win32 धागे नाम नहीं हैं। एक माइक्रोसॉफ्ट सम्मेलन है जिससे अनुप्रयोग विशेष एसईएच अपवादों को एक थ्रेड नाम रखते हैं। इन अपवादों को डिबगर्स द्वारा अवरुद्ध किया जा सकता है और थ्रेड नाम को इंगित करने के लिए उपयोग किया जा सकता है। कुछ जवाब उस कवर को कवर करते हैं।

हालांकि, यह सब डीबगर द्वारा संभाला जाता है। थ्रेड स्वयं नामहीन वस्तुएं हैं। इसलिए, यदि आप अपने धागे के साथ नाम जोड़ना चाहते हैं, तो आपको अपना खुद का तंत्र विकसित करना होगा। जबकि आप थ्रेड स्थानीय स्टोरेज का उपयोग कर सकते हैं जो आपको केवल उस थ्रेड में कोड निष्पादन से नाम प्राप्त करने की अनुमति देगा। तो थ्रेड आईडी और नाम के बीच एक वैश्विक मानचित्र सबसे प्राकृतिक और उपयोगी दृष्टिकोण की तरह प्रतीत होता है।

1

ऐसा करने का एक और तरीका थ्रेड के TEB के ArbitraryUserPointer फ़ील्ड में नाम के लिए एक सूचक को स्टोर करना है। इसे रनटाइम पर लिखा और पढ़ा जा सकता है।

"Debugging With The Thread Information Block" शीर्षक वाला कोडप्रोजेक्ट आलेख है जो आपको दिखाता है कि यह कैसे करें।

3

आप नाम को स्टोर करने के लिए थ्रेड-स्थानीय स्टोरेज ऑब्जेक्ट का उपयोग कर सकते हैं। उदाहरण के लिए,

__declspec(thread) char threadName[32]; 

फिर आप इसे थ्रेड से लिख और पढ़ सकते हैं। यह लॉगर एप्लिकेशन में उपयोगी हो सकता है, जहां आप प्रत्येक संदेश के लिए थ्रेड के नाम को मुद्रित करना चाहते हैं। जैसे ही थ्रेड शुरू होता है, आप शायद इस वैरिएबल को लिखना चाहते हैं, और माइक्रोसॉफ्ट अपवाद (https://stackoverflow.com/a/10364541/364818) भी फेंक दें ताकि डीबगर थ्रेड नाम भी जानता हो।

2

माइक्रोसॉफ्ट डीबगिंग टीम लीड के साथ चर्चा के अनुसार (विवरण के लिए नीचे लिंक देखें) SetThreadDescription API एपीआई है जिसका उपयोग माइक्रोसॉफ्ट द्वारा मूल कोड में आधिकारिक रूप से थ्रेड नामकरण का समर्थन करने के लिए किया जाएगा। "आधिकारिक तौर पर" मेरा मतलब है कि थ्रेड नामकरण के लिए एक एमएस-समर्थित एपीआई, वर्तमान अपवाद-फेंकने वाले हैक के विपरीत, जो वर्तमान में केवल विजुअल स्टूडियो में चल रही प्रक्रिया के दौरान काम करता है।

यह API, विंडोज 10 में शुरू उपलब्ध हो गया संस्करण 1607

वर्तमान में, तथापि, वहाँ बहुत कम टूलींग समर्थन है, इसलिए नाम आप सेट दृश्य स्टूडियो या WinDbg डिबगर में नहीं दिखाई देंगे। अप्रैल 2017 तक, हालांकि, माइक्रोसॉफ्ट एक्सपीआरएफ/डब्ल्यूपीए टूल्स इसका समर्थन करते हैं (इस एपीआई के माध्यम से नामित धागे उनके नाम उन उपकरणों में ठीक से दिखाए जाएंगे)।

आप इस तरह के WinDbg, विजुअल स्टूडियो, और क्रैश डंप फ़ाइलों में के रूप में इस लाभ बेहतर समर्थन, देखने के लिए चाहते हैं, तो उसके लिए वोट करें इस लिंक का उपयोग:

https://visualstudio.uservoice.com/forums/121579-visual-studio-ide/suggestions/17608120-properly-support-native-thread-naming-via-the-sett

+0

अद्यतन: विंडोज प्रदर्शन विश्लेषक और WinDbg का आगामी निर्माण अब सेट थ्रेडडिस्क्रिप्शन के माध्यम से सेट थ्रेड नाम दिखाने का समर्थन करता है। https://blogs.msdn.microsoft.com/windbg/2017/06/29/debugger-updates-in-the-16225-sdk-preview/ –

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