2010-04-02 11 views
21

मैं लिनक्स amd64 पर gdb के भीतर से C/C++ ढेर के राज्य की जांच के लिए कोशिश कर रहा हूँ, वहाँ यह करने के लिए एक अच्छा तरीका है?जांच C/C++ ढेर स्मृति gdb में आंकड़े

एक दृष्टिकोण मैं कोशिश की है करने के लिए है "कहते हैं mallinfo()" लेकिन दुर्भाग्य से मैं तो मान मैं चाहता हूँ अलग नहीं कर सकता क्योंकि gdb ठीक से वापसी मान के साथ सौदा नहीं करता है।

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

एक और विकल्प ढेर का पता लगाने और मॉलोक हेडर/मुफ्त सूची को पार करने के लिए हो सकता है; मैं किसी भी पॉइंटर्स की सराहना करता हूं जहां मैं इनके स्थान और लेआउट को ढूंढने में शुरू कर सकता हूं।

मैं गूगल की कोशिश कर दिया गया है और के बारे में 2 घंटे के लिए समस्या को हल पढ़ सकते हैं और मैं कुछ दिलचस्प सामान सीखा है, लेकिन अभी भी नहीं मिला कि मैं क्या जरूरत है।

+1

क्या आप स्थिति के बारे में जानने की आवश्यकता है? आपको किस तरह के आंकड़े जानने की ज़रूरत है? –

+0

ढेर का आकार, उपयोग की गई राशि और राशि मुक्त एक अच्छी शुरुआत –

+0

gdb ठीक से नहीं कर रहा है? – leedm777

उत्तर

20

@fd - RedHat bug आपका जवाब था।

mallinfo समारोह पदावनत किया गया है, और अद्यतन नहीं किया जाएगा। एक सच्चे प्रश्न आंकड़े एपीआई टीडीबी है। आज, आपके पास malloc_stats और malloc_info है। मुझे किसी भी दस्तावेज पर कोई दस्तावेज नहीं मिल रहा है, लेकिन यहां वे आपको क्या देते हैं।

क्या यह आपके लिए आवश्यक है?

(gdb) call malloc_stats() 
Arena 0: 
system bytes  =  135168 
in use bytes  =   96 
Total (incl. mmap): 
system bytes  =  135168 
in use bytes  =   96 
max mmap regions =   0 
max mmap bytes =   0 

(gdb) call malloc_info(0, stdout) 
<malloc version="1"> 
<heap nr="0"> 
<sizes> 
<unsorted from="1228788" to="1229476" total="3917678" count="3221220448"/> 
</sizes> 
<total type="fast" count="0" size="0"/> 
<total type="rest" count="3221220448" size="3917678"/> 
<system type="current" size="135168"/> 
<system type="max" size="135168"/> 
<aspace type="total" size="135168"/> 
<aspace type="mprotect" size="135168"/> 
</heap> 
<total type="fast" count="0" size="0"/> 
<total type="rest" count="3221220448" size="3917678"/> 
<system type="current" size="135168 
/> 
<system type="max" size="135168 
/> 
<aspace type="total" size="135168"/> 
<aspace type="mprotect" size="135168"/> 
</malloc> 
+0

अच्छा काम, मैंने कल रात malloc_stats() पाया और आज मेरे परीक्षण में इसे बहुत अच्छे प्रभाव के लिए इस्तेमाल किया। मैं सोर्सवेयर की ग्लिबिक विकी में भी भाग गया जिसने इस पोस्ट के साथ Ulrich Drepper के लाइवजर्नल को इंगित किया - http: //udrepper.livejournal।com/20948.html - अप्रैल '0 9 से mallinfo के प्रतिस्थापन का वर्णन (अन्य चीजों के साथ) लेकिन मैंने अभी तक इसे आजमाया है। आउटपुट पोस्ट करने के लिए धन्यवाद, बहुत दिलचस्प लग रहा है। +1 –

+0

वैसे, क्या आपको malloc_info() के लिए कोई दस्तावेज़ मिला? क्या पहला तर्क क्षेत्र संख्या का वर्णन करता है? मैं आउटपुट में देखता हूं, और मेरे परीक्षण में malloc_stats() कई क्षेत्रों के आंकड़े दिखाता है (एक तरफ: mallinfo() भी सीमित है कि यह केवल शून्य-वें क्षेत्र से जानकारी दिखाता है, यही कारण है कि मेरा इसके परीक्षणों ने मेमोरी उपयोग से मेल नहीं खाया जो मैंने शीर्ष पर रिपोर्ट किया था; भी, कोई भी क्षेत्र आंकड़ा उस बग को हिट करने के लिए पर्याप्त नहीं हुआ जो मैंने पहले संदर्भित किया था)। –

+0

मुझे malloc_info() के लिए दस्तावेज़ नहीं मिल रहे हैं। स्रोत के मुताबिक, 'अगर (विकल्प! = 0) वापस EINVAL' - http://sourceware.org/git/?p=glibc.git;a=blob;f=malloc/malloc.c;h=558e8bab0ab3808ec9f5b569ca62863ef4651b27; एचबी = HEAD # l6323। ऐसा लगता है कि यह सभी क्षेत्रों के माध्यम से पुनरावृत्त करता है। – leedm777

3

कोड आप बदल सकते हैं:

#include <malloc.h> 
#include <stdio.h> 

void dumpMallinfo(void) { 
    struct mallinfo m = mallinfo(); 
    printf("uordblks = %d\nfordblks = %d\n", m.uordblks, m.fordblks); 
} 

GDB में, आप call dumpMallinfo() कर सकते हैं।

+0

जैसा कि मैंने सवाल में कहा है, मैं नहीं कर सकता, हालांकि यह एक उपयोगी तकनीक है। +1 (यह गुगलिंग के 2 घंटों के दृष्टिकोणों में से एक था) –

+1

mallinfo() के बारे में जानकारी का एक उपयोगी बिट मिला; यह 64-बिट तैयार नहीं प्रतीत होता है। इंट सदस्यों से बना संरचना वापस लौटी, 4 जीबी से ऊपर बाइट आकार को संभाल नहीं पाती है। मुझे इसके लिए एक फिक्स का कोई सबूत नहीं मिला है, हालांकि मुझे एक डेबियन और रेडहाट बग रिपोर्ट दोनों को NOTABUG/WONTFIX के रूप में बंद किया गया है। –

+0

डेव के अन्य उत्तर पर मेरी टिप्पणी दोहराएं: mallinfo() भी सीमित है कि यह केवल शून्य-वें क्षेत्र से जानकारी दिखाता है, यही कारण है कि इसके मेरे परीक्षण मेमोरी उपयोग से मेल नहीं खाते हैं जो मैंने देखा शीर्ष; भी, मैंने पहले उल्लेख किए गए बग को हिट करने के लिए पर्याप्त रूप से कोई भी क्षेत्र आंकड़ा नहीं बढ़ाया। malloc_stats() सभी क्षेत्रों से जानकारी दिखाया। –