2009-11-08 4 views
6

यह पूरी तरह प्रोग्रामिंग से संबंधित प्रश्न नहीं हो सकता है, लेकिन मैं अक्सर विकास के दौरान इस पर आ जाता हूं। जब मेरा ऐप दुर्घटनाग्रस्त हो जाता है और मैं इसे मारना चुनता हूं, तो विंडोज स्वचालित रूप से "समाधान के लिए जांच कर रहा है ..." संवाद बॉक्स फेंकता है। जब मैं उस पर रद्द बटन दबाता हूं तो मुझे एक और संवाद बॉक्स मिलता है जो कहता है "प्रोग्राम को पुनरारंभ करना ..." क्या इस व्यवहार को रोकने का कोई तरीका है? जब मैं एक ऐप रोकता हूं तो मैं चुपचाप मारता हूं अगर मैं चुपचाप मारा जाता। यदि प्लेटफॉर्म महत्वपूर्ण है तो मैं विंडोज 7 का उपयोग कर रहा हूं।विंडोज़ - क्रैश को रोकें "समाधान के लिए जांच रहा है ..." और "प्रोग्राम को पुनरारंभ करना ..."

उत्तर

4

इस व्यवहार को नियंत्रित करने के लिए this article में चरणों का पालन करें।

+0

ग्रेट समाधान, सभी ऐप्स के लिए WER को हटा देता है। –

2

हालांकि माइक्रोसॉफ्ट एक नए प्रतिस्थापन केवल Windows Vista पर उपलब्ध एपीआई का उपयोग कर की सिफारिश की गई और बाद में, वहाँ एक एपीआई है जो एक्सपी से विंडोज के सभी संस्करणों के लिए काम करता है: AddERExcludedApplication()। यह फ़ंक्शन पथ जानकारी के बिना मॉड्यूल नाम लेता है (उदा।, "Myprogram.exe") जिसके लिए त्रुटि रिपोर्टिंग अक्षम की जानी चाहिए।

नई विधि केवल विंडोज विस्टा उपलब्ध है और बाद में WerAddExcludedApplication() function पर कॉल करना है। यह एपीआई आपको यह निर्दिष्ट करने की अनुमति देता है कि इसे HKEY_CURRENT_USER रजिस्ट्री हाइव, या HKEY_LOCAL_MACHINE रजिस्ट्री हाइव को बदलना चाहिए या नहीं। जैसे कि अगर HKLM सेट में विफल रहता है HKCU के लिए इस सेट करने के लिए, सुनिश्चित करें:

 
typedef BOOL (*ADD_MER_EXCLUDED_APP_XP)  (PCWSTR); 
typedef BOOL (*ADD_MER_EXCLUDED_APP_VISTA) (PCWSTR, BOOL); 

bool disable_microsoft_error_reporting(PCWSTR wz_app) 
{ 
    const WCHAR * const WZ_MER_DLL_XP  = L"faultrep.dll"; 
    const char * const SZ_MER_PROC_XP  = "AddERExcludedApplicationW"; 

    const WCHAR * const WZ_MER_DLL_VISTA = L"wer.dll"; 
    const char * const SZ_MER_PROC_VISTA = "WerAddExcludedApplicationW"; 

    const int WER_EXCLUDE_FOR_ALL_USERS = TRUE; 
    const int WER_EXCLUDE_FOR_THIS_USER = FALSE; 

    HANDLE  hlib_error_reports_xp  = NULL; 
    HANDLE  hlib_error_reports_vista = NULL; 

    ADD_MER_EXCLUDED_APP_XP  add_mer_excluded_app_xp  = NULL; 
    ADD_MER_EXCLUDED_APP_VISTA add_mer_excluded_app_vista = NULL; 

    bool  success      = false; 

    // First, attempt the API that has been around since XP. 
    hlib_error_reports_xp = LoadLibrary(WZ_MER_DLL_XP); 

    if (hlib_error_reports_xp) 
    { 
     add_mer_excluded_app_xp = (ADD_MER_EXCLUDED_APP_XP)GetProcAddress(hlib_error_reports_xp, SZ_MER_PROC_XP); 

     if (add_mer_excluded_app_xp) 
      success = add_mer_excluded_app_xp(wz_app); 

     FreeLibrary(hlib_error_reports_xp); 
     hlib_error_reports_xp = NULL; 
     add_mer_excluded_app_xp = NULL; 

     if (success) 
      return true; 
    } 

    // That did not succeed. Attempt the Vista API. 
    hlib_error_reports_vista = LoadLibrary(WZ_MER_DLL_VISTA); 

    if (hlib_error_reports_vista) 
    { 
     add_mer_excluded_app_vista = (ADD_MER_EXCLUDED_APP_VISTA)GetProcAddress(hlib_error_reports_vista, SZ_MER_PROC_VISTA); 

     if (add_mer_excluded_app_vista) 
     { 
      success = (S_OK == add_mer_excluded_app_vista(wz_app, WER_EXCLUDE_FOR_ALL_USERS)); 

      if (!success) 
       success = (S_OK == add_mer_excluded_app_vista(wz_app, WER_EXCLUDE_FOR_THIS_USER)); 
     } 

     FreeLibrary(hlib_error_reports_vista); 
     hlib_error_reports_vista = NULL; 
     add_mer_excluded_app_vista = NULL; 

     if (success) 
      return true; 
    } 

    // Nothing worked. Fail. 
    return false; 
} 

आगे, WER घटकों के निष्पादन में कटौती एक बिना क्रिया का अपवाद फिल्टर imeplement और इसे करने के लिए पारित करने के लिए: SetUnhandledExceptionFilter() function। WER को शंट करने के लिए, आपका फ़िल्टर कभी भी EXCEPTION_CONTINUE_SEARCH या EXCEPTION_EXECUTE_HANDLER वापस नहीं लौटना चाहिए।

SetUnhandledExceptionFilter() फ़ंक्शन को लागू करने की कमी में से एक यह है कि यह जस्ट-इन-टाइम डीबगिंग में हस्तक्षेप करता है।

आप उल्लेख करते हैं कि आप ऐप को "चुपचाप मार डालना चाहते हैं।" उस स्थिति में:

 

LONG WINAPI global_exception_filter(struct _EXCEPTION_POINTERS *exception_info) 
{ 
    ExitProcess(0xDEDD000D); 
} 


int WINAPI WinMain(
    HINSTANCE _hinstance, 
    HINSTANCE hinstance_prev, 
    LPSTR sz_cmd_line, 
    int cmd_show 
) 
{ 
    SetUnhandledExceptionFilter(global_exception_filter); 
    /* ... */ 
} 

एप्लिकेशन को तुरंत अनचाहे अपवाद पर गायब होने का कारण बन जाएगा। एनबी, वापसी के लिए निकास कोड स्वाद का मामला है।

+4

एक बड़ी चेतावनी: उत्पादन कोड में किसी को भी SetUnhandledExceptionFilter का उपयोग नहीं करना चाहिए। यदि आप SetUnhandledExceptionFilter का उपयोग करते हैं, तो सुनिश्चित करें कि आप अपने अपवाद फ़िल्टर में TerminateProcess को कॉल करते हैं - अन्यथा आप दो चीजों में से एक में आसानी से डिबग करने योग्य क्रैश को चालू करने जा रहे हैं: यदि आप भाग्यशाली हैं, तो आपको एक सूक्ष्म स्मृति भ्रष्टाचार मिलेगा आपके ग्राहकों के लिए परेशानी का कोई अंत नहीं होता है। यदि आप भाग्यशाली नहीं हैं, तो आप अपने आवेदन में एक शोषक सुरक्षा बग पेश करेंगे। –

+0

असल में, मेरा विचार एक फ़िल्टर स्थापित किया गया था जो FatalAppExit() को कॉल करता है। बीटीडब्ल्यू, हाय लैरी! –

+0

@ लैरी, WerAddExcludedAplication() के लिए, क्या आपको पता है कि क्या इसे पूर्ण पथ की बजाय मॉड्यूल नाम की आवश्यकता है, या इसके विपरीत? –

1

मुझे लगता है कि दूसरों के तरीके इससे बचने के लिए के साथ जवाब दे दिया है, लेकिन ...

हमें यह नहीं भूलना नहीं है कि के खिलाफ इस एक प्रोग्राम है जो दुर्घटना नहीं है लिखने के लिए सबसे अच्छा तरीका की रक्षा के लिए। :-) यदि आप स्मृति का सही ढंग से उपयोग कर रहे हैं और जीयूआई थ्रेड को लटका नहीं रहे हैं तो आपको यह नहीं देखना चाहिए।

एप्लिकेशन क्रैश के व्यवहार को बदलने से सूक्ष्म और घातक कीड़े पेश करने का एक शानदार तरीका है। माइक्रोसॉफ्ट के रेमंड चेन से this blog post भी देखें।

+0

यह जेम्स कैड का अधिकार है कि माइक्रोसॉफ्ट को अपने कोड पर जासूसी करने से रोकने के लिए, चाहे उसका कोड दुर्घटनाग्रस्त हो या कुछ एमएस डीएल वह 1 पर दुर्घटनाओं को बुलाए ग्राहकों के सिस्टम का% –

+0

मुझे नहीं लगता कि वे अपने कोड पर जासूसी कर रहे हैं। सभी क्रैश रिपोर्टों को उनके विनक्वल सिस्टम में खिलाया जाता है जहां देव अपने अनुप्रयोगों के लिए क्रैश रिपोर्ट देख सकते हैं: http://en.wikipedia.org/ विकी/विनक्वल –

+0

हां, सभी देवता जो प्रमाण पत्र रखते हैं, वे अपने आवेदन के लिए रिपोर्ट देख सकते हैं। यह कहां कहा गया है कि माइक्रोसॉफ्ट के कर्मचारी तीसरे पक्ष के अनुप्रयोगों की रिपोर्ट नहीं देख सकते हैं? उपयोग में उस खंड की खोज न करें समझौता - यह वहां नहीं है। –

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

  • कोई संबंधित समस्या नहीं^_^