2011-03-03 10 views
13

तो, कुछ हालिया परिवर्तनों के बाद हमने पाया कि हमारे सबसे पुराने अनुप्रयोगों में से एक कभी-कभी शट डाउन पर क्रैश हो रहा है। यह या तो "रनटाइम त्रुटि 216" संदेशों या विंडोज त्रुटि रिपोर्टिंग के एक संदेश में प्रकट होता है कि एप्लिकेशन ने काम करना बंद कर दिया है। एप्लिकेशन पहले से ही OutputDebugString उत्सर्जित कर रहा है-हर मोड़ पर संदेश और AFAICT हमारे सभी कोड को पूरा करने के लिए सही तरीके से निष्पादित किया जाता है। सभी विनाशकों को सभी अंतिमकरण खंड और वर्ग विनाशक कहा जाता है, जिनमें से कोई भी अपवाद नहीं उठा रहा है।एक क्रैश डीबग कैसे करें जो केवल एप्लिकेशन शट डाउन पर होता है? (डेल्फी)

इसके अलावा, न तो पागल एक्सेप्ट और न ही फास्टएमएम 4 के पूर्ण डीबग मोड के बारे में शिकायत करने के लिए कुछ भी प्रतीत होता है (हालांकि यह एक गलत निष्कर्ष हो सकता है क्योंकि क्रैश हो सकता है कि उन घटकों के अपने अंतिमकरण कोड से पहले भी क्रैश हो सकता है)।

तो, आप क्या करेंगे? आप कहां से शुरू करेंगे?


यह सवाल विशिष्ट उदाहरण मैं वर्तमान में इतना का सामना करना पड़ रहा हूँ मैं जानबूझ विवरण जा रहा हूँ के बारे में की तुलना में समस्याओं के इस वर्ग के लिए सामान्य दृष्टिकोण के बारे में अधिक माना जाता है। यह पूछने के लिए स्वतंत्र महसूस करें कि क्या आपको लगता है कि वे डिबगिंग दृष्टिकोण की पसंद के लिए प्रासंगिक हो सकते हैं और मैं उन्हें बाद में जोड़ूंगा।

+4

एक वीसीएल बग है जो शटडाउन पर एवी के रूप में प्रकट होता है। यह 'मालिक' रूपों के विनाश से संबंधित है। मैं 'application.Run' के बाद .dpr फ़ाइल में रूपों को स्पष्ट रूप से बंद करके इसे चारों ओर काम करता हूं। यदि आप 'एप्लिकेशन' को आपके लिए बंद करने देते हैं तो बालों के संदर्भों में समस्याएं हो सकती हैं। –

+0

@ डेविड: यह दिलचस्प लगता है। क्या आपके पास इसके लिए क्यूसी नंबर है? हालांकि, मुख्य रूप को छोड़कर मैं मालिक के रूप में संबंधित माता-पिता के रूप में कोड में सभी रूपों को बना रहा हूं। क्या आप जिस मुद्दे पर बात कर रहे हैं, उस मामले में भी लागू होगा? –

+0

यदि आप सब कुछ नीचे लाने के लिए आवेदन के विनाश पर भरोसा कर रहे हैं, तो मैं जिस बग के बारे में बात कर रहा हूं वह लागू हो सकता है। अपनी .dpr फ़ाइल में 'MainForm.Free' डालने का प्रयास करें। मैं क्यूसी नंबर देखेंगे। –

उत्तर

2

आपको संभावित रूप से एक सूचक समस्या मिली है। कुछ घटना या विधि उस ऑब्जेक्ट पर चलाने की कोशिश कर रही है जो अब मौजूद नहीं है।

+0

हां, यही है कि "रनटाइम त्रुटि 216" कम या ज्यादा तात्पर्य है, लेकिन सवाल यह था कि आप उस समस्या को कैसे ट्रैक करने के बारे में जानेंगे? –

+0

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

+0

@ डेविड: इस मुद्दे का "विश्वसनीय प्रजनन" अभी भी एक समस्या है: मैं कहूंगा कि यह लगभग 60% समय होता है। और मैं अभी तक यह निर्धारित करने में सक्षम नहीं हूं कि कामकाजी और गैर-कार्य सत्रों के बीच क्या अंतर हो सकता है। मैंने वास्तव में पहले ही सोचा है कि मैंने कुछ बार बाद में कुछ सत्रों को फिर से शुरू करने के लिए समस्या को ठीक कर दिया है ... –

3

अच्छी तरह से Runtime error 216 स्मृति समस्या (Access violation) हैं, ऐसा लगता है कि आप उस वस्तु को संदर्भित करते हैं जो उस समय मौजूद नहीं है।

Emarcadero लिखते हैं:

अनुप्रयोग जो SysUtils अपवाद के वर्ग मैप सबसे क्रम त्रुटियों, जो आपके आवेदन को समाप्त बिना त्रुटि को हल करने के लिए अनुमति का उपयोग

आप को अंतिम रूप देने में एक breackpoint सेट करने का प्रयास किया था Sysutils के खंड?

मैं इसे आवंटन/मेमोरी प्रोफाइलर के साथ आज़माउंगा, यह सुनिश्चित नहीं है कि आपको त्रुटि कोड लाइन मिलेगी लेकिन यह आपको आपके कोड के कुछ हिस्सों को दिखा सकती है जहां मेमोरी समस्याएं होती हैं।

5

क्या आप रनटाइम पैकेज का उपयोग कर रहे हैं? मैंने पहले इसी तरह के मुद्दों को देखा है। यदि आप पैकेज सीमाओं में ग्लोबल्स या इंटरफेस साझा कर रहे हैं, तो आपको यह सुनिश्चित करना होगा कि उस पैकेज को अनलोड किए जाने से पहले किसी निश्चित पैकेज से संबंधित वर्गों के सभी संदर्भ साफ़ हो जाएं; अन्यथा वे वर्चुअल कॉल को स्मृति में बनाने का प्रयास करेंगे जो अब मान्य नहीं है।

+0

ओह हाँ, न केवल रनटाइम पैकेज बल्कि COM-DLLs (यानी प्लगइन्स) जो इन पैकेजों पर निर्भर करते हैं (जैसा मेजबान EXE करता है)। मत पूछो मैं आज इस तरह से ऐसा नहीं करूँगा, लेकिन यह अब 10 से अधिक वर्षों से चल रहा है ... हालांकि मैं कुछ वैश्विक सिंगलेट्स के किसी संदर्भ को दोहरा दूंगा। यह वास्तव में वादा करता है ... –

+2

"अब 10 से अधिक वर्षों के लिए निर्दोष चल रहा है" क्या बदल गया है? शायद यह है कि मैं इस समस्या पर हमला कैसे करूंगा। –

+0

टच! ;) वह एक स्वीकार्य उत्तर के लिए लगभग काफी अच्छा है। :-P –

12

रनटाइम त्रुटि 216 का अर्थ है कि आपके पास एक एवी (एक्सेस उल्लंघन) है और SysUtils ने उन त्रुटियों को अपवादों में अनुवाद करना बंद कर दिया है।

पहला प्रयास करें: डीसीयू डीबग के साथ बनाएं और यूनिट सिस्टम में देखें जहां त्रुटि उठाई गई है, वहां ब्रेकपॉइंट सेट करें। उम्मीद है कि आप इसे डीबगर में पकड़ सकते हैं और वहां से काम कर सकते हैं।

आपके पास शायद पहले से ही अंतिमकृत इकाई में एस स्ट्रिंग स्थिरता का उपयोग करने के लिए एक मेमोरी बग (लटकते पॉइंटर, नल संदर्भ इत्यादि) का उपयोग करना है और सबसे अच्छी चाल सिसुटिल्स को अंतिम रूप देने के बाद अंतिमकरण की जांच करना है। आप इसे डीबग डीसीयू के साथ बनाकर कर सकते हैं, सिसुटल्स में अंतिम रूप देने के लिए ब्रेक पॉइंट सेट कर सकते हैं और त्रुटि होने तक कोड के माध्यम से कदम उठाना शुरू कर सकते हैं।

2

"रनटाइम त्रुटि 216" विंडोज़ से ही है, डेल्फी अपवाद हैंडलर नहीं। मैंने पाया है कि यह कोड के कारण होता है जो इकाइयों के प्रारंभिकरण और अंतिमकरण खंडों में चलता है, जो डेल्फी अपवाद हैंडलर के सामने निष्पादित होते हैं। विशेष रूप से। COM ऑब्जेक्ट जिन्हें डेल्फी ऐप को समाप्त करने के बाद चलने वाले अंतिमकरण कोड के माध्यम से अनलोड करने की आवश्यकता है, यह और इसी तरह की त्रुटियों का कारण बन जाएगा। तो उस सामान की जांच करें।

MNG

+3

बिल्कुल नहीं: यूनिट सिस्टम में देखें: फ़ंक्शन MapToRunError एनआर त्रुटि कोड STATUS_ACCESS_VIOLATION को एररकोड में मानचित्र करता है: = 216. –

+0

टिप्पणी के लिए धन्यवाद - भले ही यह डिफ़ॉल्ट डेल्फी एप्लिकेशन अपवाद हैंडलर के पहले या बाद में होता है। यूनिट्स को डेल्फी एप्लिकेशन लॉन्च करने से पहले उपयोग खंड के आधार पर लोड किया जाता है, एप्लिकेशन को समाप्त होने के बाद अनलोड किया जाता है - यूनिट लोड और अनलोड पर चलने वाला प्रारंभ और अंतिमकरण अनुभाग और इसलिए वहां चलने वाला कोड डेल्फी एप्लिकेशन अपवाद हैंडलर द्वारा नियंत्रित नहीं होता है। यही कारण है कि आपको एक क्रिप्टिक 'रनटाइम त्रुटि 216' या 217 मिलती है और कोई अपवाद संदेश 'Eaccess उल्लंघन .. @' आदि – user643124

+1

यह सच नहीं है; 216 डेल्फी आरटीएल से है, अपवाद हैंडलिंग तंत्र को बिना छेड़छाड़ के बाद।यह एक एवी है कहने का डेल्फी तरीका है। 216 विंडोज़ नहीं है। –

2

अन्य लोगों की तरह ने कहा: 216 ए वी का मतलब है के बाद SysUtils बंद था। आम तौर पर, एकमात्र चीज जो SysUtils के बाद बंद हो जाती है (और एवी बढ़ाने का मौका होता है) - सिस्टम इकाई है। विशेष रूप से: मेमोरी मैनेजर।

तो, शटडाउन पर रन-टाइम त्रुटि 216 आमतौर पर मेमोरी भ्रष्टाचार आपके आवेदन में बग का मतलब है।

यह हल करना बहुत आसान हो सकता है - बस मेमोरी मैनेजर में पूर्ण डीबग मोड सक्षम करें या डिबगिंग मेमोरी मैनेजर का उपयोग करें। कभी-कभी, हालांकि, यह खोजना बहुत मुश्किल हो सकता है। लेकिन आप पहले एमएम के डीबग मोड से शुरू कर सकते हैं।

this article देखें।

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