2012-03-28 9 views
21

मेरे काम को डराना मैं विनियामक चेहरा बल्कि सामान्य प्रोग्रामिंग त्रुटि - कुछ वस्तु का उपयोग कर जो पहले ही मुक्त हो चुका है। यह सी ++ में यूबी का आह्वान करता है। लिनक्स पर, इस प्रकार की समस्याएं आमतौर पर वालग्रिंड टूल मेमचेक का उपयोग करके हल की जाती हैं। Memcheck manual से:क्या मुफ्त त्रुटियों के बाद विंडोज़ डिबग करने के लिए विंडोज़ के लिए उपकरण की तरह वालग्रिंड मेमचेक है?

Memcheck स्थापित करने के लिए के बाद से है कि अक्सर उपयोगी होता है क्या अवैध पते पर, संबंधित हो सकता है की कोशिश करता है। इसलिए, यदि यह स्मृति के ब्लॉक में इंगित करता है जिसे पहले से ही मुक्त कर दिया गया है, तो आपको इसके बारे में सूचित किया जाएगा, और जहां ब्लॉक को मुक्त किया गया था।

मेमचेक मुझे कॉल स्टैक प्रदान करता है, जहां ऑब्जेक्ट को हटा दिया गया था और मैं समस्या पर जा सकता हूं और डीबग कर सकता हूं। क्या समान कार्यक्षमता के साथ विंडोज के लिए समान उपकरण है, अधिमानतः मुफ़्त है?

+0

मुझे अतीत में शुद्धता के साथ शुभकामनाएं मिली हैं लेकिन यह निश्चित रूप से मुफ़्त नहीं है। –

+2

http://stackoverflow.com/questions/413477/is-there-a-good-valgrind-substitute-for-windows – stanwise

+0

यदि आप केवल सी के उत्तर में रूचि रखते हैं, तो मेरे पास एक है। –

उत्तर

4

डॉ मेमोरी प्रलेखन के अनुसार, -delay_frees_stack विकल्प बिल्कुल वैलग्रींड कार्यक्षमता के साथ है।Option Reference से:

Here is another example, using the -delay_frees_stack option to obtain the callstack of the freed memory: 

Error #8: UNADDRESSABLE ACCESS: reading 0x001338a8-0x001338ac 4 byte(s) 
# 0 unaddr_test1     [e:\derek\drmemory\git\src\tests\suppress.c:110] 
# 1 test       [e:\derek\drmemory\git\src\tests\suppress.c:269] 
# 2 main       [e:\derek\drmemory\git\src\tests\suppress.c:297] 
Note: @0:00:02.141 in thread 3024 
Note: next higher malloc: 0x001338e8-0x00133938 
Note: prev lower malloc: 0x001337e8-0x00133820 
Note: 0x001338a8-0x001338ac overlaps memory 0x001338a8-0x001338c4 that was freed here: 
Note: # 0 test       [e:\derek\drmemory\git\src\tests\suppress.c:269] 
Note: # 1 main       [e:\derek\drmemory\git\src\tests\suppress.c:297] 
Note: instruction: mov (%eax) -> %eax 
17

रूप Lailin चेन this सवाल करने के लिए अपने जवाब में बताया इनमें से किसी एक का प्रयास करें:

डॉ मेमोरी: https://github.com/dynamorio/drmemory

UMDH: http://support.microsoft.com/kb/268343

AppVerifier: http://msdn.microsoft.com/en-us/library/dd371695%28v=vs.85%29.aspx

+0

मैंने ऐपविरिफायर को आजमाया है, यह नहीं बताता कि ऑब्जेक्ट को कब हटाया गया था। – ks1322

+1

एप्लिकेशन सत्यापनकर्ता को इसे पूर्ण स्मृति सुरक्षा के साथ पकड़ना चाहिए। जब आप ऑब्जेक्ट को मुक्त करते हैं, तो यह हटाए गए पृष्ठों की सुरक्षा करता है, जिसके परिणामस्वरूप कोई अपवाद फेंकने पर भविष्य में कोई भी ऑपरेशन होता है। –

+0

ऐपविरिफायर बकवास है, जब इसके साथ प्रोग्राम चलाते हैं तो इंटेल टीबीबी कोड में ब्रेकपॉइंट ट्रिगर करता है ... क्रैपी प्रोग्राम, लेकिन idk शायद यह ठीक है अगर आप उस चेक को अक्षम करते हैं – NoSenseEtAl

5

The method that worked for me लिए किया गया था कस्टम मेमोरी मैनेजर लिखें जो वैश्विक ऑपरेटरों को "नया" और "डिलीट" प्रदान करता है, और वर्चुअलप्रोटेक्ट के साथ हर मुक्त/उपयोग किए गए मेमोरी ब्लॉक को लॉक करता है। इस तरह मुक्त स्मृति का उपयोग करने का कोई भी प्रयास तुरंत पहुंच उल्लंघन को ट्रिगर करेगा जिसे आप पकड़ और डीबग कर सकते हैं। हालांकि, ऐसा करने में सक्षम होने के लिए, आपको VirtualAlloc जैसे कुछ उपलब्ध स्मृति (या इसमें से 3/4) का उपयोग करके "आपके द्वारा लौटाए गए प्रत्येक मेमोरी ब्लॉक (प्रारंभ में आवंटित ब्लॉक से) PAGE_SIZE संरेखित होना चाहिए (देखें GetSystemInfo दस्तावेज), अन्यथा आप इसे विश्वसनीय रूप से लॉक करने में सक्षम नहीं होंगे। जिसका अर्थ है कि इस विधि का उपयोग करने के लिए यहां तक ​​कि छोटे अनुप्रयोग को स्मृति की बड़ी मात्रा की आवश्यकता हो सकती है।

"विंडोज़ के लिए वालग्रिंड विकल्प" के लिए - मैंने इसके बारे में सुना है। किसी ने कहीं पोस्ट किया है कि साइगविन के साथ वालग्रिंड का संकलन/उपयोग करना संभव हो सकता है, लेकिन मुझे नहीं पता कि यह सच है या नहीं।

4

यहाँ एक बहादुर Valgring प्रयास है, और मैं उन्हें शुभकामना:

http://sourceforge.net/p/valgrind4win/wiki/Home/

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

आईओयू: जब सूअर उड़ते हैं।

+0

विंडोज स्रोत कोड तक पहुंच क्यों होगी? – Jeff

3

क्या सबसे अच्छा काम किया के लिए मुझे Visual leak Detector उपयोग कर रहा था, सब मुझे क्या करना करने के लिए आवश्यक शामिल करने के लिए किया गया था::

#include <vld.h> 

-delay_frees_stack 
default: false 
Record callstacks on free to use when reporting use-after-free or other errors that overlap with freed objects. There is a slight performance hit incurred by this feature for malloc-intensive applications. 

इसके अलावा यहां error reported by Dr. Memory का एक उदाहरण है निष्पादन योग्य की शुरुआत में मैं परीक्षण करना चाहता था। फिर विंडोज़ के भीतर से डीबग निष्पादन योग्य चलाना, सभी लीक मेमोरी के बारे में विस्तृत जानकारी प्रदान करेगा। आउटपुट से आप सीधे उस रेखा तक पहुंच सकते हैं जहां मेमोरी आवंटित की गई थी, ताकि आप देखभाल कर सकें