2012-01-12 17 views
10

पर होने वाले अपवाद को पकड़ना मैं Win32 अपवाद के कारण अपने आवेदन में कुछ क्रैश की जांच कर रहा हूं, और मैंने इसे कम कर दिया है कि यह थ्रेडपूल में हो रहा है जो EventLog.EntryWrittenEventHandler ईवेंट हैंडलर की देखभाल कर रहा है आवेदन। मैं इस सेट अप इस तरह:सी # थ्रेडपूल

// Create the event log monitor 
eventLog.Log = "Application"; 
eventLog.EnableRaisingEvents = true; 
eventLog.EntryWritten += new EntryWrittenEventHandler(EventLogMonitor); 

EventLogMonitor मेरी घटना के लिए हैंडलर है। मैं सोच रहा हूं कि क्या किसी के पास कोई विचार है कि मैं यह अपवाद कहां से प्राप्त कर सकता हूं। ऐसा लगता है कि घटनाओं को सुनने के लिए ThreadPoolWaitOrTimerCallback स्थापित किया जा रहा है, जिसमें मेरा कोई कोड नहीं होगा, और अगर इस पर अपवाद हो रहा है तो मैं यह नहीं देख सकता कि इस समस्या से निपटने के लिए कैसे। कोई भी मदद सचमुच सराहनीय होगी!! !

यहाँ WinDBG में clrstack के उत्पादन में है:

0:008> !clrstack 
OS Thread Id: 0x106c (8) 
ESP  EIP  
049df1c8 7756f871 [HelperMethodFrame: 049df1c8] 
049df26c 73ce6fa0 System.Diagnostics.EventLog.get_OldestEntryNumber() 
049df27c 73bf24ed System.Diagnostics.EventLog.CompletionCallback(System.Object) 
049df2c4 73bf0fe4 System.Diagnostics.EventLog.StaticCompletionCallback(System.Object, Boolean) 
049df2f4 744fc3b8 System.Threading._ThreadPoolWaitOrTimerCallback.WaitOrTimerCallback_Context(System.Object, Boolean) 
049df300 744fc373 System.Threading._ThreadPoolWaitOrTimerCallback.WaitOrTimerCallback_Context_f(System.Object) 
049df304 7400027f System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object) 
049df31c 744fc477 System.Threading._ThreadPoolWaitOrTimerCallback.PerformWaitOrTimerCallback(System.Object, Boolean) 
049df4ac 74991b5c [GCFrame: 049df4ac] 

मामले में यह मदद करता है, अपने आवेदन सिर्फ ईवेंट लॉग के लिए लिखा हर प्रविष्टि की घटना आईडी जाँच कर रहा है, और अगर यह एक में से एक से मेल खाती है आईडी के कुछ सेट तो मैं इसे लॉग करता हूं। दुर्घटनाएं शायद ही कभी शांत हो जाती हैं, और अपवाद एक सिस्टम है। संदेश 'एक्सेस अस्वीकार कर दिया गया है' संदेश के साथ कॉम्पोनेंट मॉडेल। Win32 अपवाद। ऐसा लगता है कि यह एक अनुमति मुद्दा हो सकता है लेकिन यह एक निश्चित अवधि के लिए ठीक क्यों काम करेगा और फिर अचानक इसके साथ दुर्घटनाग्रस्त हो जाएगा।

+0

यह अपवाद किस तरह का है? –

+0

सिस्टम। कॉम्पोनेंट मॉडेल। Win32 संदेश 'एक्सेस अस्वीकृत है' के साथ अपवाद। अजीब बात यह है कि यह बहुत ही कम होता है, मेरा आवेदन जो सेवा के रूप में चलता है, दिन के लिए जा सकता है और फिर अचानक यह इसके साथ दुर्घटनाग्रस्त हो जाता है .. – DukeOfMarmalade

+0

क्या यह संभव है कि आप अपना खुद का निर्माण करने की कोशिश कर रहे हैं, पहले कभी भी इस्तेमाल नहीं किया गया स्रोत स्रोत, और वह यह केवल तब दुर्घटनाग्रस्त हो जाता है? –

उत्तर

5

यदि मैं आपको सही ढंग से समझता हूं (यदि आप स्टैकट्रैक पास करते हैं तो यह आपकी मदद करेगा जो आपको निष्कर्ष तक पहुंचाता है कि अपवाद थ्रेडपूल थ्रेड के अंदर हो रहा है), फिर बस कोशिश/पकड़ ब्लॉक में EventLogMonitor के अपने कोड को लपेटें।

उदाहरण:

void EventLogHandler(object sender, EventArgs args) 
{ 
    try 
    { 
     // Your original code. 
    } 
    catch (Exception ex) 
    { 
     // Log or Write "ex" to the console. Set a breakpoint, whatever. 

     throw; 
    } 
} 

अद्यतन: अगर आपके अपडेट के बाद यह के रूप में यदि अपवाद वास्तव में अपने हैंडलर अंदर से बढ़ाया नहीं गया है, लेकिन इससे पहले कि यह भी इवेंटलॉग वर्ग के अंदर कहा जाता है।

आप AppDomain.UnhandledException ईवेंट के साथ एक हैंडलर पंजीकरण करने का प्रयास कर सकते हैं और वहां अपना लॉगिंग/हैंडलिंग कर सकते हैं। ध्यान दें कि यह आपको दबाने या "बदलने" या अपवाद को लपेटने की अनुमति नहीं देगा, लेकिन केवल नैदानिक ​​उद्देश्यों के लिए इसे लॉग इन करने के लिए।

यदि आप केवल एक बार (या अवसर पर) अपवाद का निरीक्षण करना चाहते हैं, तो आपको WinDBG में SOS-extension के !PrintException कमांड का उपयोग करने का प्रयास करना चाहिए।

अद्यतन 2: आगे की जांच के बाद मुझे यह अजीब लगता है कि अपवाद सभी को बुलबुले करता है। आपका स्टैकट्रैस सुझाव देता है कि आप .NET 3.5 (या पहले, लेकिन 4 नहीं) का उपयोग कर रहे हैं और रिफ्लेक्टर में इवेंटलॉग क्लास को देख रहे हैं, आप देख सकते हैं कि EventWrittenHandler की संपूर्ण हैंडलिंग, जिसमें अपवाद का कारण प्रतीत होता है, प्रीम्बल कोड समेत, है एक बड़े "कोशिश/पकड़ (अपवाद)/पकड़" ब्लॉक में लपेटा। मजेदार।

+0

मैंने अपने प्रश्न में क्लस्टर को आउटपुट जोड़ा है। मैंने वास्तव में कोशिश की है कि आप ईसाई.के. का सुझाव दे रहे हैं और मेरा आवेदन अभी भी प्रयास/पकड़ने के बिना दुर्घटनाग्रस्त हो गया है। कुछ थ्रेडपूल पर अपवाद हो रहा है कि .NET को ईवेंट लॉग से प्रविष्टि लिखित घटनाओं को सुनने के लिए सेट अप करना होगा, और अपवाद थ्रेड में प्रचार नहीं करते हैं, इसलिए मुझे नहीं लगता कि यह काम करेगा। फिर भी सुझाव के लिए धन्यवाद! – DukeOfMarmalade

+0

इस मुद्दे पर आपकी मदद के लिए धन्यवाद क्रिश्चियन.के, मैं अभी भी इसके निचले हिस्से तक पहुंच गया हूं, इस मुद्दे को माइक्रोसॉफ्ट पर पास करना पड़ा, आपके सुझावों ने हालांकि इस मुद्दे की जांच करने में बहुत मदद की! – DukeOfMarmalade

+0

बहुत बुरा हम इसे पूरी तरह से समझ नहीं पाए। मैंने इस मुद्दे पर दो बार विचार किया है, लेकिन कुछ नए विचारों के साथ नहीं आया (जो वास्तव में बहुत कुछ नहीं कहता है :-)। –

0
  1. यदि आप कर सकते हैं, System.Threading.Tasks में कार्य का उपयोग करें।
  2. कोशिश करें, जहां आप जो चाहते हैं वह क्रिया कर रही है। जैसे कुछ अपवाद है कि मुख्य थ्रेड में नहीं हैं पकड़ने के लिए सक्षम होने के लिए इस प्रकार

    ThreadPool.QueueUserWorkItem(state => 
    { 
        try 
        { 
         action(); 
        } 
        catch (Exception ex) 
        { 
         OnException(ex); 
        } 
    }); 
    
+0

मुझे नहीं लगता कि यह काम करेगा, जब आप EventLogEntryWritten ईवेंट हैंडलर की सदस्यता लेते हैं तो एक अलग थ्रेडपूल इवेंट लॉग में लिखे गए प्रविष्टियों की निगरानी करने के लिए प्रतीत होता है, यह थ्रेडपूल पर है कि अपवाद होता है। ThreadException के लिए – DukeOfMarmalade

1

अपने Program.cs में Application.ThreadException की सदस्यता लें।

static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.ThreadException += Application_ThreadException; 
     try 
     { 
      Application.Run(new MainForm()); 
     } 
     catch (Exception e) 
     { 
      HandleException(e); 
     } 
    } 

    static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e) 
    { 
     HandleException(e.Exception); 
    } 
+2

+1! –

0

सुनिश्चित नहीं हैं कि आवेदन की किस तरह यह है, इसलिए एक सामान्य मामले में, आप कोई भाग्य आ रही है तो, AppDomain जिसमें कोड चल रहा है में hooking का प्रयास करें। यदि आप अनेक डोमेन की जरूरत नहीं है, तो आप की कोशिश कर सकते हैं:

AppDomain.CurrentDomain.FirstChanceException += Handler

या

AppDomain.CurrentDomain.UnhandledException += Handler

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