2011-02-27 7 views
26

हमारे एप्लिकेशन में अजीब घातक सिस्टम का अनुभव होता है। एक्सेसऑलिओशन अपवाद। हम इन्हें देखते हैं क्योंकि हमने अपवाद लॉग करने के लिए AppDomain.CurrentDomain.UnhandledException ईवेंट कॉन्फ़िगर किया है।सिस्टम का कारण ढूंढ रहा है .AccessViolationException

Exception: System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt. 
    at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg) 
    at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData) 
    at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context) 
    at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context) 
    at System.Windows.Forms.Application.Run(Form mainForm) 
    at Bootstrap.Run() in e:\build-dir\src\Bootstrap.cs:line 25 

अपवाद ही संदेश के अलावा कोई और जानकारी है प्रतीत नहीं होता है "पढ़ने के लिए या संरक्षित स्मृति लिखने के लिए प्रयास किया गया। इस बार एक संकेत है कि अन्य स्मृति भ्रष्ट है।"

  • समस्या के कारण पाने के लिए अब हम क्या कदम उठा सकते हैं?
  • क्या अवैध पता या सूचक मूल्य निर्धारित करने का कोई तरीका है जो दुर्घटना का कारण बनता है?
  • क्या हम यह पता लगा सकते हैं कि मूल पुस्तकालय कोड समस्या का कारण बन रहा था?
  • क्या कोई और डिबगिंग/ट्रेसिंग सक्षम है जिसे हम सक्षम कर सकते हैं?

अद्यतन

  • इस WinForms API के पिछले गैर threadsafe उपयोग की वजह से हो सकता है?
+1

पर्याप्त प्रतीकों भी साथ देने के लिए भरी हुई है, तो आप एक डिबगर संलग्न के साथ इस चल की कोशिश की है (db-int32 या NVARCHAR के लिए लंबी (10) जो कम है के लिए एक लंबे में गुजर) एक उपयोगी कॉलस्टैक? –

उत्तर

5

जो आप अनुभव कर रहे हैं वह सटीक समकक्ष है "प्रोग्राम को एक समस्या का सामना करना पड़ा है और अब बंद हो जाएगा", ओएस के बजाए .NET रनटाइम द्वारा पकड़ा जा रहा है।

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

इस तरह कुछ ट्रैक करने का एकमात्र तरीका डीबगर के तहत मूल पुस्तकालयों को चलाने के लिए होगा, जो सीएलआर परत तक बुलबुले से पहले प्रवेश उल्लंघन को फँसाना चाहिए। यह आसान या कठिन हो सकता है।

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

+1

यह एक कार्यकर्ता धागा नहीं है, यह मुख्य यूआई थ्रेड पर मर जाता है। नोट आवेदन। रुन() –

+1

हंस टिप्पणी के साथ सहमत हैं। हमें .NET परावर्तक में उपयोगकर्ताओं की मशीनों पर कभी-कभी इसकी रिपोर्ट मिलती है: Application.Run() AccessViolationException फेंकता है, लेकिन हमें नहीं पता कि क्यों। यह बहुत असामान्य है और हमने इसे कभी घर में नहीं देखा है, इसलिए हम इसे कभी डीबग करने में सक्षम नहीं हुए हैं। मुझे क्या गलत हो रहा है इसके बारे में कुछ ठोस विचार पसंद आएगा ताकि हम कम से कम उपयोगकर्ताओं को कुछ उपयोगी जानकारी की दिशा में इंगित कर सकें, लेकिन हां, अब तक मुझे इनकार कर दिया गया है। –

3

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

आपके यूई पर नियंत्रण जानने के बिना और जो भी घटनाएं आपने कनेक्ट की हैं, यह निर्धारित करना मुश्किल होगा कि समस्या वास्तव में क्या है।

2

मुझे एक ही समस्या थी और लगातार @ बार्टरेड के विपरीत। मेरे लिए, कुछ सीएलआई कोड एक साधारण विंडोज़ फॉर्म ऐप में ठीक काम कर रहे थे, लेकिन जब मैंने इसे लॉगर प्लगइन पारिस्थितिक तंत्र (बहुप्रचारित) में रखा था, तो संदेशों को एप्लिकेशन के साथ पंप करने की आवश्यकता होती है। रून या एप्लिकेशन। डॉवेंट्स। यदि आपके पास पंप होने वाले कोड तक पहुंच है, तो सर्वोत्तम शर्त (मेरे लिए क्या काम किया गया) कार्यक्षमता बनाए रखने के दौरान कोड के अधिक से अधिक टुकड़ों पर टिप्पणी करना था। यह पता चला कि मेरे पास जीसी :: कॉलकबैक/प्रतिनिधि नहीं था और पिन किए गए और अभी भी संदर्भित स्मृति के आसपास या सीधे संग्रह के लिए ध्वजांकित किया गया था।

यदि आप जीसी एलोक का उपयोग करते हैं तो अपने आप को साफ करना सुनिश्चित करें!

1

एडीओ का उपयोग करके संग्रहीत प्रक्रिया को निष्पादित करते समय मुझे यह समस्या थी। इस त्रुटि में दो कारण थे:

  1. खराब कनेक्शन स्ट्रिंग।
  2. पैरामीटर प्रकार मिस-मैच