6

इससे पहले मुझे सी (विजुअल स्टूडियो) में गतिशील स्मृति के साथ एक समस्या का सामना करना पड़ा। मेरे पास एक कम या कम कामकाजी प्रोग्राम था जिसने बफर में से किसी एक को मुक्त करते समय रन-टाइम त्रुटि फेंक दी। यह एक स्पष्ट स्मृति भ्रष्टाचार था, कार्यक्रम बफर के अंत में लिखा था।मेमोरी भ्रष्टाचार डिबगिंग

मेरी समस्या यह है कि यह ट्रैक करने में बहुत समय लग रहा था। भ्रष्टाचार के बाद त्रुटि को नीचे फेंक दिया गया था, और बफर एंड ओवरराइट होने पर मुझे यह पता लगाने के लिए मैन्युअल रूप से पूरे रन को डीबग करना पड़ा।

क्या इस समस्या को ट्रैक करने में सहायता करने के लिए कोई उपकरण \ तरीका है? इस पर नज़र रखने में सहायता के लिए

int *pNum = malloc(10 * sizeof(int)); 

//     || 
//     \/  
for(int i = 0; i < 13; i++) 
{ 
pNum[i] = 3; 
} 

// error.... 
free(pNum); 
+0

इस प्रकार का नहीं है 'बफर सेक्युटिटी चेक' कंपाइलर विकल्प पाप वीएस करता है? – stijn

+4

जादू संख्या का उपयोग न करें? – phant0m

+5

@ phant0m यह वास्तविक कोड नहीं था, यह एक उदाहरण था, न ही यह मेरा कोड था ... बफर गतिशील रूप से डेटा के आकार के आधार पर आवंटित किया गया था, और उसके आकार की गणना करने वाले फ़ंक्शन में एक छोटी बग थी ... मेरे प्रश्न के अलावा इस मुद्दे को ट्रैक करने के बारे में है, इसे रोकने से नहीं ... –

उत्तर

3

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

2

वहाँ है किसी भी उपकरण \ तरीका: यदि कार्यक्रम तुरंत दुर्घटनाग्रस्त हो गया है | मैं बहुत तेजी से समस्या पाया है कि ...

मुद्दे का एक उदाहरण मुद्दा?

हां, यह ठीक प्रकार का त्रुटि है जो स्थैतिक कोड विश्लेषक ढूंढने का प्रयास करते हैं। जैसे http://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis

संपादित करें:: अपने कोड स्निपेट पर पट्टी बाहर की कोशिश में मैं निम्नलिखित चेतावनी मिलती है: splint/PC-Lint

यहाँ इस तरह के उपकरणों की एक सूची है

main.c: 9: 2: संभावित आउट-ऑफ-बाउंड स्टोर: पनम [i]

संभवतः यह चेतावनी आपको सहायता प्रदान करेगी।

3

मैं इसके लिए "डेटा ब्रेकपॉइंट्स" का उपयोग करता हूं। आपके मामले में, जब कार्यक्रम दुर्घटनाओं, यह पहली इस तरह की शिकायत हो सकती है: 00397848 0039789C अतीत में संशोधित पर

ढेर ब्लॉक 4c

के आकार का अनुरोध किया उसके बाद, फिर से अपने कार्यक्रम शुरू करते हैं, और एक सेट पता 0039789C पर डेटा ब्रेकपॉइंट। जब कोड उस पते पर लिखता है, तो निष्पादन बंद हो जाएगा। यह अक्सर होता है कि मुझे इस बिंदु पर तुरंत बग मिलती है।

अपने कार्यक्रम आवंटित करता है और बार बार स्मृति deallocates, और यह इस सटीक पते पर होना करने के लिए होता है, बस deallocations निष्क्रिय कर दें:

_CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _CRTDBG_DELAY_FREE_MEM_DF); 
0

हमारे CheckPointer उपकरण स्मृति प्रबंधन त्रुटियों को खोजने में मदद कर सकते हैं। यह जीसीसी 3/4 और सी के माइक्रोसॉफ्ट बोलीभाषाओं के साथ काम करता है।

कई गतिशील चेकर्स केवल किसी ऑब्जेक्ट के के बाहर पहुंचते हैं, और तब केवल ऑब्जेक्ट को आवंटित किया जाता है। चेकपॉन्टर को मेमोरी एक्सेस त्रुटियों के अंदर एक ढेर-आवंटित ऑब्जेक्ट मिलेगा; क्षेत्र के प्रकार के बावजूद एक संरचना में एक क्षेत्र के अंत तक पहुंचना अवैध है; सबसे गतिशील चेकर्स ऐसी त्रुटियों का पता नहीं लगा सकते हैं। यह स्थानीय लोगों के किनारे से भी पहुंच पाएगा।

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