2010-07-26 14 views
7

मेरे पास जीडीबी में एक सूचक है, मैं यह कैसे पता लगा सकता हूं कि इसे पहले ढेर पर आवंटित किया गया था?जीडीबी में, कैसे पता लगाएं कि ढेर पर एक पता किसने किया?

WinDBG में, इस वेलग्रिंड के बाद से gflags /i <*exe> +ust

को चालू करने से मुझे बता सकते हैं जहां स्मृति आवंटित किया जाता है (जब यह कुछ लीक का पता लगाता है), मुझे लगता है यह भी संभव है के बाद !heap -p -a <0x12345678> के द्वारा किया जा सकता है?

(यह है नहीं watchpoint के बारे में। यह स्थिति है जहाँ मैं बेतरतीब ढंग से GDB, आवेदन में में तोड़, एक सूचक को देखो और पता करने के लिए "जो स्मृति के इस टुकड़े निर्मित" चाहते दिया जाता है?)


जीडीबी में रिवर्स डीबगिंग का उपयोग करना एक बहुत ही उपन्यास तरीका है और शायद इस समस्या को हल करने के लिए सही तरीका है। मुझे जीडीबी 7.1 - नवीनतम स्थिर संस्करण के साथ उस दृष्टिकोण के साथ कुछ समस्या का सामना करना पड़ा। रिवर्स डिबगिंग जीडीबी में एक नई सुविधा है इसलिए मुझे इसे ठीक करने के लिए हेड (7.2) की जांच करने की आवश्यकता है।

यह शायद जीडीबी दृष्टिकोण की परिपक्वता के बारे में कुछ कहता है लेकिन मुझे लगता है कि यह अधिक परिपक्व होने पर निश्चित रूप से उपयोग किया जाना चाहिए। (बहुत बढ़िया फीचर!)

उत्तर

3

वालग्रिंड मेमोरी मैनेजमेंट कॉल को हाइजैक करता है, इस प्रकार हीप चेकर्स काम करते हैं। जीडीबी में खुद को यह बताने के लिए कोई सुविधा नहीं है कि malloc(3) द्वारा दिया गया पता वापस लौटाया गया था। मैं सुझाव देता हूं कि mtrace और glibc allocation debugging देखें।

+0

धन्यवाद! आपके दृष्टिकोण और केएस 1322 दोनों मान्य लगते हैं। Mtrace और glib आवंटन डीबगिंग के बारे में जानना अंतर्दृष्टिपूर्ण है। दूसरी तरफ, मुझे लगता है कि केएस 1332 का दृष्टिकोण अधिक चालाक है और शायद जीडीबी (इस प्रकार प्रश्न का शीर्षक) के करीब है। मैं दोनों के साथ प्रयोग करूँगा और सही जवाब चुनने से पहले अभ्यास में कौन सा बेहतर होगा। – kizzx2

6

शायद reverse debugging यहां सहायता करेगा। मेमोरी एड्रेस पर वॉचपॉइंट सेट करने का प्रयास करें और मेमोरी लिखित तक रिवर्स-जारी रखें।

(gdb) watch *0x12345678 
(gdb) reverse-continue 
+0

धन्यवाद! आपके दृष्टिकोण और निकोलाई दोनों मान्य लगते हैं। आपका दृष्टिकोण अधिक चालाक है और शायद जीडीबी (इस प्रकार प्रश्न शीर्षक) के करीब है। दूसरी ओर यह mtrace और glib आवंटन डीबगिंग के बारे में जानना अंतर्दृष्टिपूर्ण है। मैं दोनों के साथ प्रयोग करूँगा और सही जवाब चुनने से पहले अभ्यास में कौन सा बेहतर होगा। – kizzx2

+0

हां, यह मजेदार है, लेकिन मुझे नहीं लगता कि यह बहुत छोटे कार्यक्रमों के अलावा व्यावहारिक है (कभी भी मल्टीथ्रेडिंग को ध्यान में रखें)। –

+0

@ निकोलई: यह सच प्रतीत होता है। जबकि रिवर्स-डिबगिंग तकनीकी दृष्टि से वास्तव में रोमांचक है, लेकिन शायद यह कई मामलों में पर्याप्त परिपक्व नहीं है। एक शोस्टॉपर यह है कि 'रिकॉर्ड' यह हैलो वर्ल्ड प्रोग्राम में नहीं चलाएगा, क्योंकि यह किसी भी आईओ (टीटीवी, फाइल सिस्टम, आदि) को रिकॉर्ड करने से इंकार कर देता है। वह अकेला वास्तविक जीवन की स्थिति में उपयोग करने के लिए अव्यवहारिक बनाता है। मुझे यकीन नहीं है कि यह इरादा व्यवहार है। – kizzx2

2

रिकॉर्ड हैलो वर्ल्ड प्रोग्राम पर चलता है। हेक मैं जीडीबी खुद को डीबग करने के लिए रिकॉर्ड का उपयोग करता हूं!

+0

याद दिलाने के लिए धन्यवाद! जब मैंने कोशिश की तो मैं स्पष्ट रूप से अज्ञानी था - उसने कहा "ऑपरेशन असमर्थित या कुछ।" मुझे लगता है कि यह 32 बिट 64 बिट समस्याओं से संबंधित हो सकता है। मैंने पूरी तरह से 32 बिट उबंटू पर फिर कोशिश की और यह एक आकर्षण की तरह काम किया! आर्क x86_64 पर यह क्यों काम नहीं कर सकता है पर कोई मार्गदर्शन? (मुझे संदेह है कि यह ग्लिबैक या कुछ के 64 बिट संस्करण से संबंधित हो सकता है, मैं नहीं जानता: पी) – kizzx2

+0

रिकॉर्ड/रीप्ले कभी-कभी कुछ चेतावनियों को थकाता है, लेकिन इसका मतलब यह नहीं है कि यह काम नहीं कर रहा है। इसे x86_64 के लिए भी काम करना चाहिए, लेकिन i386 समर्थन अधिक परिपक्व है। –

+0

मैंने इस मुद्दे को देखा।यह विशेष समस्या इसलिए थी क्योंकि मेरा libc कुछ एमएमएक्स निर्देशों को संकलित करने के लिए संकलित किया गया था जो जीडीबी 7.1 समर्थित नहीं था। मैंने हेड (7.2 लिखने के समय) की जांच की और यह काम किया। – kizzx2