2015-05-23 8 views
7

मैं विजुअल स्टूडियो 2013 अल्टीमेट के साथ विंडोज 8.1 64-बिट का उपयोग कर रहा हूं। मैं लिनक्स से विंडोज तक एक प्रोग्राम पोर्ट कर रहा हूं जो सी ++, ओपनजीएल और एसडीएल का उपयोग करता है। मेरे पास विंडोज़ पर 64-बिट पर cmake के माध्यम से संकलित उचित पुस्तकालय कस्टम है। जब मैं विजुअल स्टूडियो से प्रोग्राम चलाता हूं, तो आईडीई का कहना है कि सिर भ्रष्टाचार है। यह कोई आश्चर्य की बात नहीं है क्योंकि मैं ऑब्जेक्ट्स को तुरंत चालू करने के लिए पॉइंटर्स का उपयोग कर रहा हूं, और मैं कच्चे पॉइंटर्स का उपयोग कर रहा हूं जो मैं तर्क के लिए स्मार्ट पॉइंटर्स में बदलने की योजना बना रहा हूं। मैं बाद में बढ़ावा जादू करूँगा।मैं विंडोज़ पर भ्रष्टाचार की त्रुटियों का ढेर कैसे निदान करूं?

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

तो, प्रोग्राम लिनक्स पर काम करता है और यह विंडोज पर नहीं है। (बस बढ़िया!) और विजुअल स्टूडियो पूरी जगह पर अपवाद फेंकने में मदद नहीं कर रहा है जो मुझे विंडोज़ से भी ज्यादा नफरत करता है। मैंने समाधान के लिए चारों ओर घूमना शुरू कर दिया और gflags या पेज सहायक नामक इस चीज़ में आया, इसलिए मैंने डिबगिंग टूल इंस्टॉल किए और gflags लॉन्च करने का प्रयास किया लेकिन मुझे नहीं पता कि इसका उपयोग कैसे किया जाए! बाद में मैंने पाया कि आपको एडीपी नामक किसी अन्य टूल का उपयोग करना था और उसके बाद gflags संलग्न करना था, इसलिए जब मैंने एडीपी लॉन्च किया तो यह दुर्घटनाग्रस्त हो गया। तो अब मुझे नहीं पता कि बंदरगाह को रद्द करने के कगार पर क्या करना है और क्या है (जो मजाकिया है क्योंकि कई लोग शिकायत कर रहे हैं कि विंडोज़ से लिनक्स तक पोर्ट प्रोग्राम करना कितना मुश्किल है जबकि विपरीत है)।

तो, अब मैं सहायता के लिए इस समुदाय से अपील करता हूं: मैं विंडोज़ पर होने वाली भ्रष्टाचार त्रुटियों को कैसे डीबग/निदान करता हूं लेकिन लिनक्स पर नहीं? क्या मैं वास्तव में gflags का उपयोग करना चाहता हूं या क्या मुझे इस पर अपने गले का उपयोग करना चाहिए?

+1

वीएस में एक आंतरिक स्मृति रिसाव डिटेक्टर है: https://msdn.microsoft.com/en-us/library/x98tx3cf(v=vs.120).aspx –

+0

क्या आपने डीबगर का उपयोग किया है? आप linux पर clang sanatizers भी कोशिश कर सकते हैं। शायद वे कुछ valgrind और सीपीपी चेक नहीं मिला। – MikeMB

+0

क्षमा करें मैंने थोड़ी देर में जवाब नहीं दिया है। मुझे अभी भी यह समस्या है, लेकिन ऐसा लगता है कि यह बाहरी .dll फ़ाइल से आ रहा है। मुझे यकीन नहीं है कि यह मेरे अंत में एक समस्या है या नहीं, यह कहने के लिए पर्याप्त है कि पहुंच उल्लंघन 0xFF त्रुटियां परेशान हैं! – Poriferous

उत्तर

6

डीबग ढेर का उपयोग करें और इसे मुख्य() में बहुत शुरुआत में कॉल करें।

_CrtSetDbgFlag(_CRTDBG_CHECK_ALWAYS_DF);

यह नीचे कार्यक्रम एक बहुत धीमी हो जाएगी, लेकिन यह रूप में जल्द ही भ्रष्टाचार होता है के रूप में तोड़ना चाहिए।

जानकारी के लिए इस लेख देखें: https://msdn.microsoft.com/en-us/library/974tc9t1.aspx#BKMK_Check_for_heap_integrity_and_memory_leaks

+0

आपकी प्रतिक्रिया के लिए धन्यवाद। मैं इस डीबगिंग फ़ंक्शन में कभी नहीं आया, इसलिए यह दिलचस्प होगा। उत्तम सामग्री! – Poriferous

1

@ कार्लोस के समाधान छोटे समस्याओं के लिए एकदम सही है। लेकिन बड़ी समस्याओं के लिए, परिणामी धीमी गति से कभी-कभी ऐसा कुछ होता है जिसे आप पेट नहीं कर सकते।

इस मामले में, एक कोड है, जहां एक समस्या पहले से ही संदेह है उपस्थित होना में कहीं

ASSERT(_CrtCheckMemory()); 

रख सकते हैं। यह आदेश _CRTDBG_CHECK_ALWAYS_DF के मामले में प्रत्येक new या delete कॉल के बाद नहीं (और केवल उस स्थान पर) ढेर की जांच करता है। यह _CRTDBG_CHECK_ALWAYS_DF विकल्प की तुलना में निष्पादन समय उचित रखता है।

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

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