2011-01-14 3 views
19

में सफल सस्पेंड थ्रेड के बाद विफल रहता है मुझे विंडोज 7 में एक नमूना प्रोफाइलर पर एक अजीब समस्या का सामना करना पड़ रहा है (पिछले विंडोज ओएस पर AFAICT ऐसे कोई समस्या नहीं है, चाहे वे 32 या 64 बिट हों)।GetThreadContext विंडोज 7

प्रोफाइलर समय-समय पर SuspendThread साथ एक धागा निलंबित करके काम करता है, फिर, GetThreadContext साथ संदर्भ में दिखता है ResumeThread लागू प्रक्रिया पुनः आरंभ करने से पहले। यह सब एक मल्टीमीडिया टाइमर के धागे के संदर्भ से किया जाता है (सटीकता के लिए, लगभग 1kHZ पर, जो प्री-विंडोज 7 ओएस पर आम तौर पर एक नगण्य प्रदर्शन जुर्माना लगाता है)।

विंडोज 7, और विंडोज 7 के तहत केवल, भले ही SuspendThread (और ResumeThread) सभी के लिए कॉल सफल होते हैं तो GetThreadContext के लिए कॉल त्रुटि के साथ विफल:

ERROR_NOACCESS
998 (0x3E6)
Invalid access to memory location.

एक बहुत ही उच्च इस संभावना को साथ

, हालांकि सभी नहीं समय।

कि मेरा मतलब है कि के लिए कुछ रूपरेखा चलाता है, सब कुछ के रूप में यह अन्य OSes (सभी GetThreadContext कॉल सफल होगा) पर करता है काम करेंगे, लेकिन अन्य रनों के लिए, वे लगभग सभी (असफल हो जायेगी से बाहर हो सकता है एक दर्जन से बचाने के लिए, तक हजारों के दसियों)। यह वही पैरामीटर, वही पैरामीटर के साथ हो रहा है।

मैंने GetThreadContext कॉल दोहराने के लिए अस्पष्ट रूप से समान दिखने वाले मुद्दों पर सुझावों का प्रयास किया है, और अधिक सफलता के साथ। मैंने को SuspendThread और GetThreadContext के बीच करने का भी प्रयास किया है, तो GetThreadContext अधिक बार सफल होता है, हालांकि इसके परिणामस्वरूप कठोर मंदी होती है।

यह सुझाव देता है कि विंडोज 7 ओएस SuspendThread से लौट रहा है, जबकि थ्रेड शायद अभी तक निलंबित नहीं किया गया है - हालांकि, अगर ऐसा है, तो मुझे नहीं पता कि निलंबन पर सही तरीके से इंतजार करना है या नहीं, मुझे लूपिंग धागा और तेज़ GetThreadContext ऐसा नहीं करता है।

संपादित करें: 16 बाइट GetThreadContext के लिए CONTEXT संरचना के पते संरेखित के रूप में दान बार्टलेट ने सुझाव दिया चाल कर किया जा रहा है!

+0

बहुत विशिष्ट दिखता है। शायद आपको समस्या का पता लगाने के लिए विंडोज़ का एक चेक बनाया जाना चाहिए? क्या आपने एमएसडीएन डेवलपर मंचों में इस समस्या का वर्णन किया था? या शायद सीधे एमएस पर एक बग फाइल करें। – ChristianWimmer

+3

क्या आपने प्रक्रिया बनाते समय THREAD_ALL_ACCESS प्रॉपर्टी का उपयोग किया था? Http://msdn.microsoft.com/en-us/library/ms686769(v=vs.85).aspx देखें जो बताता है कि "THREAD_ALL_ACCESS ध्वज का मान Windows Server 2008 और Windows Vista पर बढ़ गया" ... –

+9

CONTEXT को WinNT.h में "DECLSPEC_ALIGN (16)" के साथ घोषित किया गया है, हो सकता है कि यह एक संरेखण मुद्दा हो? –

उत्तर

16

GetThreadContext समारोह को देखते हुए, यह कहा गया है कि

The CONTEXT structure is highly processor specific. Refer to the WinNt.h header file for processor-specific definitions of this structures and any alignment requirements.

और इस फाइल को देख, _CONTEXT

typedef struct DECLSPEC_ALIGN(16) _CONTEXT { 
... 

साथ घोषित किया जाता है तो यह यह एक संरेखण समस्या हो सकती है संभव है।

+0

बेवकूफ हास्यास्पद तथ्य: आप विंडोज 9एक्स पर GetThreadContext() को CONTEXT संरचना के साथ 16 तक असाइन किए गए कॉल के साथ कॉल कर सकते हैं, लेकिन NT के बाद से GetThreadContext को ठीक काम करने के लिए आपको इसकी मेमोरी लोकेशन को संरेखित करने की आवश्यकता है। –