2009-11-01 20 views
6

वीएस 2008 और एमएफसी अनुप्रयोग का उपयोग कर आईएम ब्रेकपॉइंट्स सेट करने या कर्सर पर चलने पर क्रैश करना शुरू कर दिया है। मैं इस तरह त्रुटियों के बहुत सारे मिल: -एक्सेस उल्लंघन का पता लगाएं 0xC00000FD

First-chance exception at 0x78a5727c (mfc90ud.dll) in MyApp.exe: 0xC0000005: Access violation reading location 0xfffffffc. 
First-chance exception at 0x00000000 in MyApp.exe: 0xC0000005: Access violation reading location 0x00000000. 
First-chance exception at 0x00000000 in MyApp.exe: 0xC0000005: Access violation reading location 0x00000000. 
First-chance exception at 0x00000000 in MyApp.exe: 0xC0000005: Access violation reading location 0x00000000. 
First-chance exception at 0x00000000 in MyApp.exe: 0xC0000005: Access violation reading location 0x00000000. 
First-chance exception at 0x00000000 in MyApp.exe: 0xC0000005: Access violation reading location 0x00000000. 
First-chance exception at 0x00000000 in MyApp.exe: 0xC0000005: Access violation reading location 0x00000000. 
First-chance exception at 0x00000000 in MyApp.exe: 0xC0000005: Access violation reading location 0x00000000. 
First-chance exception at 0x00000000 in MyApp.exe: 0xC0000005: Access violation reading location 0x00000000. 
First-chance exception at 0x00000000 in MyApp.exe: 0xC0000005: Access violation reading location 0x00000000. 
First-chance exception at 0x00000000 in MyApp.exe: 0xC0000005: Access violation reading location 0x00000000. 

कॉल स्टैक ज्यादा नहीं छोड़ा है या तो उसे केवल कोड NT.dll

में सूचीबद्ध करता है
> 00000000() 
    ntdll.dll!7c9032a8()  
    [Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll] 
    ntdll.dll!7c90327a()  
    ntdll.dll!7c92aa0f()  
    ntdll.dll!7c90e48a()  
    ntdll.dll!7c9032a8()  

मैं ब्रेक अंक का उपयोग कर समस्या का पता लगाने में सक्षम नहीं हूँ या मेरे कोड के माध्यम से कदम। VS में F5 का उपयोग करके चलाए जाने पर एप्लिकेशन सामान्य रूप से चलाने के लिए "लगता है"।

इस समस्या को ट्रैक करने के लिए सबसे अच्छी विधि क्या है?

+0

क्या आपने वीएस में सभी अपवादों को सक्षम करने का प्रयास किया था? फिर भी यह इसे पकड़ नहीं है? – Naveen

+0

हां लेकिन ऐसा करने के बाद मुझे एक और अपवाद मिलता है जिसे प्रारंभिक डोमोडल कहा जाता है, जिसे मैंने सही तरीके से देखा है। मेरा आवेदन जादूगर आधारित है। जिस तरह से मैं सभी अपवादों को पोस्ट की गई मूल समस्या प्राप्त करने में सक्षम बनाता हूं। – Paul

+0

अपने स्टैकफ्रेम पर राइटक्लिक करें और ntdll के लिए प्रतीकों को लोड करें। कुछ हल नहीं करेंगे, लेकिन अधिक जानकारी चोट नहीं पहुंचा सकती है। – sisve

उत्तर

5

आपके प्रश्न शीर्षक से ढेर ओवरफ़्लो कहां है? एक्सेस उल्लंघन आमतौर पर एक अवैध सूचक dereference इंगित करता है।

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

+0

टाइपो शीर्षक में उल्लंघन का उपयोग करना चाहिए। मैं कर सकता था और इसके बारे में सोचा था लेकिन ऐप में इस चरण में कई महीनों का काम आया है। मैं उम्मीद कर रहा था कि एक तेज रास्ता होगा लेकिन अगर नहीं तो पर्याप्त उचित होगा। – Paul

+0

यदि इसमें कई महीनों का काम आया है, तो आप कुछ स्रोत नियंत्रण प्रणाली का उपयोग कर रहे हैं, है ना? यदि नहीं, तो अभी * * करना शुरू करें। गंभीरता से। – Thomas

+0

हां। मैं शुरुआत के बाद से TortoiseSVN का उपयोग कर रहा हूँ। – Paul

0

विजुअल स्टूडियो के पास पहले अवसर अपवाद को तोड़ने के लिए कहीं विकल्प है (यह याद नहीं है कि यह कहां है, शायद डीबग सबमेनू में एक अपवाद मेनू आइटम?) आप इसे चालू करना चाहते हैं और अपने कॉल स्टैक्स को देखना चाहते हैं पल वे होते हैं।

माइक्रोसॉफ्ट सिंबल सर्वर को चालू करने का एक विकल्प भी है, जो स्टैक में जो भी सिस्टम डेल देखने के लिए होता है, उसके लिए मेल खाने वाले प्रतीकों को स्वचालित रूप से डाउनलोड करेगा। (क्षमा करें, याद रखें कि यह वास्तव में सेटअप कैसे करता है)।

+0

यह डीबग के तहत है अपवाद | Win32 अपवाद। उपरोक्त अपवाद शून्य सूचक dereferencing के लिए अजीब परिचित लग रहा है। – MP24

2

मैं अपने मानसिक डिबगिंग कौशल का उपयोग करूंगा और आपको बताऊंगा कि आप एक बफर को ओवरराइट कर रहे हैं जो ढेर पर रहता है - विशेष रूप से, आप एक बफर में बहुत अधिक शून्य लिख रहे हैं जो इसे पकड़ने के लिए पर्याप्त नहीं है।

आपको एक धराशायी स्टैक के क्लासिक लक्षण मिल गए हैं - आपके द्वारा मारा जाने वाला पहला एवी शून्य बाइट्स को कुछ बाइट्स तक पहुंचने का प्रयास कर रहा है - स्पष्ट रूप से आपके स्टैक पॉइंटर से आपके पैरामीटर या आपके स्थानीय चर में एक ऑफ़सेट। (मुझे याद नहीं है कि कौन से स्टैक पॉइंटर से ऊपर हैं और कौन से नीचे हैं।) फिर आपके पास लाइनों का एक समूह है जो इंगित करता है कि निर्देश पॉइंटर शून्य पर सेट किया गया है, जो अक्सर होता है क्योंकि फ़ंक्शन फ़्रेम में फ़ंक्शन रिटर्न पते होते हैं शून्य मानों के साथ ओवरराइट किया गया - क्योंकि आप स्टैक-आधारित बफर को ओवरराइट करते हैं और स्टैक पर अन्य सभी महत्वपूर्ण सामग्री को दूषित करते हैं। चूंकि आपका प्रोग्राम वर्तमान फ़ंक्शन से वापस लौटने का प्रयास करता है, यह देखता है कि यह कहां से आया है, शून्य देखता है, और वहां कूदता है। ओह!

चूंकि आपका ढेर ट्रैश हो गया है, तो आपको स्टैक ट्रेस बहुत उपयोगी नहीं मिल सकता है; इस बिंदु से आपके ढेर के फ्रेम दूषित होने की संभावना है।

2

वेब पर कुछ "टेम्पलेट्स" है कि उनके Windows प्रोग्राम इसके बजाय WndProc()

case WM_CLOSE: 
    PostQuitMessage(SUCCESS); 
    break; 
case WM_DESTROY: 
    DestroyWindow(hwnd); 
    break; 

में इस बात का बनाने के लिए कुछ का उपयोग हम इस मिल रहे हैं:

case WM_CLOSE: 
    DestroyWindow(hwnd); 
    break; 
case WM_DESTROY: 
    PostQuitMessage(SUCCESS); 
    break; 

तो SUCCESS 0 है, DestroyWindow() एक शून्य-पॉइंटर प्राप्त करता है जो विंडो बंद होने के कारण अपवाद उत्पन्न करता है।

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