2015-05-12 13 views
7

में लटकता है कुछ पृष्ठभूमि: मैं एक बग को ट्रैक करने की कोशिश कर रहा हूं जो मुझे प्रमुख सिरदर्द पैदा कर रहा है।प्रोग्राम विजुअल स्टूडियो डीबगर

....................................................................................................0 
....................................................................................................1 
....................................................................................................2 
........................... 

अजीब:

#include <thread> 
#include <vector> 
#include <iosfwd> 
#include <sstream> 
#include <string> 
#include <windows.h> 

int main() 
{ 
    SRWLOCK srwl; 
    InitializeSRWLock(&srwl); 
    for(size_t i=0;i<1000;++i) 
    { 
     std::vector<std::thread>threads; 
     for(size_t j=0;j<100;++j) 
     { 
      OutputDebugString("."); 
      threads.emplace_back([&](){ 
       AcquireSRWLockExclusive(&srwl); 
       //Code below modifies the probability to see the bug. 
       std::this_thread::sleep_for(std::chrono::microseconds(1)); 
       std::wstringstream wss; 
       wss<<std::this_thread::get_id(); 
       wss.str(); 
       //Code above modifies the probability to see the bug. 
       ReleaseSRWLockExclusive(&srwl);}); 
     } 
     for(auto&t:threads){t.join();} 
     OutputDebugString((std::to_string(i)+"\n").data()); 
    } 
    return 0; 
} 

जब मैं 2013 डिबगर वी.एस. अंदर इस कोड को चलाने के कार्यक्रम इस तरह एक उत्पादन के साथ लटका हुआ है: कई मृत समाप्त होता है (this question देखें) के बाद मैं अंत में इस कोड के साथ समाप्त हो गया पर्याप्त, अगर मैं डीबगर को रोकता हूं और निरीक्षण करता हूं कि क्या हो रहा है, तो थ्रेडों में से एक AcquireSRWLockExclusive (NtWaitForAlertByThreadId में) के अंदर है, जाहिर है कि प्रोग्राम लटक रहा है इसका कोई कारण नहीं है। जब मैं फिर से शुरू करता हूं, तो प्रोग्राम खुशी से जारी रहता है और फिर से अवरुद्ध होने तक कुछ और सामान प्रिंट करता है।

क्या आपके पास कोई विचार है कि यहां क्या हो रहा है?

कुछ अधिक जानकारी:

  • जहां तक ​​मेरा बता सकते हैं, इस बग केवल Windows 8.1 पर मौजूद है।
  • मैंने वीएस2013.4 और वीएस2015 आरसी की कोशिश की।
  • मैं इसे विंडोज 8.1 के तहत दो अलग-अलग कंप्यूटरों पर पुन: पेश कर सकता हूं।
  • मशीन में से एक प्रारूप सही नहीं था, रैम, सीपीयू और डिस्क का परीक्षण किया (मैं एक खराबी के बारे में सोचा क्योंकि पहली बार में मैं केवल इस विशेष मशीन पर बग का निरीक्षण कर सकते हैं)
  • मैं Windows 7.
  • पर यह पुन: पेश नहीं कर सकता था
  • बग का निरीक्षण करने के लिए टिप्पणियों के बीच कोड को संशोधित करना उपयोगी हो सकता है। जब मैंने माइक्रोसेकंद नींद को जोड़ा, तो मैं आखिरकार किसी अन्य कंप्यूटर पर बग को पुन: पेश कर सकता था।
  • वीएस2015 आरसी के साथ मैं एक ही व्यवहार को एक साधारण std :: mutex के साथ पुन: पेश कर सकता हूं। वीएस2013 पर हालांकि SRWLOCK बग का पालन करना अनिवार्य लगता है।
+0

क्या आप डेडलॉग में हो सकते हैं और एक बार जब आप डीबगर दर्ज कर लेते हैं तो यह सिंक्रनाइज़ेशन बदलता है और डेडलॉक गायब हो जाता है। – NathanOliver

+0

@NathanOliver यह कैसे संभव हो सकता है? कोड में केवल एक म्यूटेक्स है। – Arnaud

+0

क्या डीबगर के बाहर चलाने पर प्रोग्राम कभी लटका हुआ है? –

उत्तर

4

यह समस्या ओएस शेड्यूलर बग के कारण वसंत 2014 अपडेट में विंडोज 8.1 में पेश की गई है। इस समस्या के लिए एक हॉटफिक्स मई 2015 में जारी किया गया था और https://support.microsoft.com/en-us/kb/3036169 पर उपलब्ध था।

+0

मैंने हॉटफिक्स को आजमाया और यह समस्या हल करता है। हालांकि यह बहुत धीमा लगता है। – Arnaud

1

मेरे लिए यह विंडोज़ ओएस में एक बग की तरह लग रहा है, मैं अलग अलग कोड वेरिएंट कि विन 8.1/सर्वर 2012R2 में डिबगर के तहत नए Vista पुरातन का उपयोग कर लटकी हुई है के बाद अप्रैल 2014 अद्यतन किया है। इसके अलावा कुछ थ्रेड पूल प्रतीक्षा समारोह भी लटकता है। ऐसा लगता है कि यह ज्यादातर प्रतीक्षा/लॉक के पल में अन्य थ्रेड समाप्त निष्पादन से जुड़ा हुआ है।

#include <windows.h> 

#include <stdio.h> 
#include <conio.h> 
#include <tchar.h> 

#pragma optimize("",off) 
VOID CALLBACK _WorkCallback(PTP_CALLBACK_INSTANCE Instance, PVOID pUser, PTP_WORK Work) 
{ 
    for (int i = 0; i < INT_MAX/256; i++) {} 
} 

DWORD WINAPI ThreadProc(LPVOID lpParameter) 
{ 
    for (int i = 0; i < INT_MAX/256; i++) {} 
    return 0; 
} 
#pragma optimize("",on) 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    LONGLONG c = 0; 

    while(!_kbhit()) 
    { 
     PTP_WORK ptpw = CreateThreadpoolWork(&_WorkCallback, NULL, NULL); 
     if (ptpw != NULL) 
     { 
      for(long i = 0; i < 3; i++) SubmitThreadpoolWork(ptpw); 

      CreateThread(NULL, 0, ThreadProc, NULL, 0, NULL); 

      WaitForThreadpoolWorkCallbacks(ptpw, FALSE); 
      CloseThreadpoolWork(ptpw); 
     } 

     printf("%I64d         \r", c++); 
    } 

    _getch(); 
    return 0; 
} 

दुर्भाग्य से मुझे पता नहीं है, जहां इसे Microsoft को रिपोर्ट करने के लिए है: यहाँ) सरल कोड है कि हमेशा NtWaitForAlertByThreadId (में डिबगर के तहत लटका हुआ है।

+0

मैं अपने सिस्टम पर लटकाने का पुनरुत्पादन भी कर सकता हूं। – Arnaud

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