मैं GDB में C ++ वेक्टर के तत्वों को कैसे प्रिंट करूं?


210

मैं std::vectorGDB में ए की सामग्री की जांच करना चाहता हूं , मैं यह कैसे करूं? मान लीजिए कि यह std::vector<int>सरलता के लिए है।


3
इसी तरह के सवाल: stackoverflow.com/questions/427589/… (उत्तर में लिंक बहुत दिलचस्प है)।
पाओलो टेडेस्को

ऐसा करने का नया, बेहतर तरीका इस प्रश्न में है: stackoverflow.com/questions/2492020/…
dshepherd

जवाबों:


79

वेक्टर std :: वेक्टर myVector सामग्री देखने के लिए, GDB में बस टाइप करें:

(gdb) print myVector

यह एक उत्पादन के समान होगा:

$1 = std::vector of length 3, capacity 4 = {10, 20, 30}

ऊपर प्राप्त करने के लिए, आपको gdb 7 (मैं इसे gdb 7.01 पर परीक्षण किया गया है) और कुछ अजगर सुंदर-प्रिंटर चाहिए। इनकी स्थापना प्रक्रिया gdb विकि पर वर्णित है ।

क्या अधिक है, ऊपर स्थापित करने के बाद, यह ग्रहण C ++ डिबगर GUI (और GDB का उपयोग करने वाले किसी अन्य आईडीई के साथ अच्छी तरह से काम करता है , जैसा कि मुझे लगता है)।


16
यह ठीक काम करता है जब तक कि वेक्टर तत्व सीधे व्याख्या करने योग्य नहीं होते हैं। लेकिन यह मदद नहीं करता है अगर वेक्टर में रुचि के आइटम के संकेत होते हैं।
wallyk

मैं स्पष्ट रूप से gdb विकी पृष्ठ को विशेष रूप से पठनीय नहीं पाता , शायद इसलिए कि यह अब "थोड़ा" पुराना हो गया है? उदाहरण के लिए, मुझे आभास था कि सुझाई गई सामग्री $HOME/.gdbinitआवश्यक थी। फिलहाल मैं ऐसी किसी भी फाइल के साथ समाप्त नहीं हुआ हूं और gdbसही ढंग से सामग्री दिखा रहा हूं std::vector। हालाँकि, जब से मेरे "रिबॉकिंग" के प्रयासों के दौरान मैंने बस स्थापित किया और फिर बिना किसी बाधा के cgdb, और मैंने पहले ही libstdc++5स्थापित कर दिया था, मुझे नहीं पता कि सुंदर छपाई क्यों काम नहीं करती थी जबकि अब यह काम करती है।
एनरिको मारिया डे एंजेलिस

257

GCC 4.1.2 के साथ, संपूर्ण std :: वेक्टर <int> को myVector कहा जाता है, प्रिंट करने के लिए, निम्नलिखित कार्य करें:

print *(myVector._M_impl._M_start)@myVector.size()

केवल पहले N तत्वों को मुद्रित करने के लिए, करें:

print *(myVector._M_impl._M_start)@N

व्याख्या

यह संभवतः आपके संकलक संस्करण पर बहुत अधिक निर्भर है, लेकिन GCC 4.1.2 के लिए, आंतरिक सरणी के लिए सूचक है:

myVector._M_impl._M_start 

और सूचक P पर शुरू होने वाले सरणी के N तत्वों को प्रिंट करने के लिए GDB कमांड है:

print P@N

या, एक संक्षिप्त रूप में (एक मानक .gdbinit के लिए):

p P@N

4
हे, यह कुछ ऐसा है जो मुझे पहले ही खराब कर दिया गया था, इसलिए मैंने आज सुबह ही इसे देखा और इसे अपने लिए एक मेमो के रूप में जोड़ा (जैसा कि जेफ ने खुद सिफारिश की थी)।
जॉन कार्टर

3
इसके अलावा, अगर आप केवल एक विशेष वेक्टर तत्व चाहते हैं, तो myVector._M_impl._M_start + n (nth तत्व के लिए)
mariner

1
मेरे लिए काम नहीं कर रहा है। Cannot evaluate function -- may be inlined
wallyk

1
किसी एक तत्व को प्रिंट करने के लिए, दूसरा तत्व: प्रिंट (myVector._M_impl._M_start) [2]
jfritz42

2
विशेष नाम (जानने के लिए _M_implGDB के तहत अपने संकलक 7.0+, उपयोग के लिए आदि)print /r myVector
नामस्रोत

14

डिबगिंग करते समय एसटीएल कंटेनरों को 'देखना' एक समस्या है। यहां 3 अलग-अलग समाधान हैं जो मैंने अतीत में उपयोग किए हैं, उनमें से कोई भी सही नहीं है।

1) http://clith.com/gdb_stl_utils/ से GDB स्क्रिप्ट का उपयोग करें। ये स्क्रिप्ट आपको लगभग सभी STL कंटेनरों की सामग्री प्रिंट करने की अनुमति देती हैं। समस्या यह है कि यह सेट के ढेर की तरह नेस्टेड कंटेनरों के लिए काम नहीं करता है।

2) विजुअल स्टूडियो 2005 में एसटीएल कंटेनरों को देखने के लिए शानदार समर्थन है। यह नेस्टेड कंटेनरों के लिए काम करता है, लेकिन यह केवल एसटीएल के लिए उनके कार्यान्वयन के लिए है और अगर आप बोएल कंटेनर में एसटीएल कंटेनर डाल रहे हैं तो यह काम नहीं करता है।

3) डिबगिंग करते समय आप जिस विशिष्ट आइटम को प्रिंट करना चाहते हैं, उसके लिए अपना 'प्रिंट' फ़ंक्शन (या विधि) लिखें और आइटम को प्रिंट करने के लिए जीडीबी में 'कॉल' का उपयोग करें। ध्यान दें कि यदि आपका प्रिंट फ़ंक्शन कहीं भी नहीं बुलाया जा रहा है तो कोड g ++ मृत कोड उन्मूलन करेगा और GDB द्वारा 'प्रिंट' फ़ंक्शन नहीं मिलेगा (आपको यह कहते हुए एक संदेश मिलेगा कि फ़ंक्शन इनबिल्ड है)। इसलिए -fkeep-inline-functions को संकलित करें


11

निम्नलिखित को ~ / .gdbinit में डालें

define print_vector
    if $argc == 2
        set $elem = $arg0.size()
        if $arg1 >= $arg0.size()
            printf "Error, %s.size() = %d, printing last element:\n", "$arg0", $arg0.size()
            set $elem = $arg1 -1
        end
        print *($arg0._M_impl._M_start + $elem)@1
    else
        print *($arg0._M_impl._M_start)@$arg0.size()
    end
end

document print_vector
Display vector contents
Usage: print_vector VECTOR_NAME INDEX
VECTOR_NAME is the name of the vector
INDEX is an optional argument specifying the element to display
end

Gdb (या सोर्सिंग ~ / .gdbinit) को पुनरारंभ करने के बाद, इस तरह से संबंधित सहायता दिखाएं

gdb) help print_vector
Display vector contents
Usage: print_vector VECTOR_NAME INDEX
VECTOR_NAME is the name of the vector
INDEX is an optional argument specifying the element to display

उदाहरण का उपयोग:

(gdb) print_vector videoconfig_.entries 0
$32 = {{subChannelId = 177 '\261', sourceId = 0 '\000', hasH264PayloadInfo = false, bitrate = 0,     payloadType = 68 'D', maxFs = 0, maxMbps = 0, maxFps = 134, encoder = 0 '\000', temporalLayers = 0 '\000'}}

2
कोड के लिए धन्यवाद! मुझे लगता है कि एक टाइपो है और "प्रिंट * ($ arg0._M_impl._M_start + $ elem) @ 1" का "प्रिंट * ($ arg0._M_impl._M_artart + $ arg1) @ 1" होना चाहिए? मैं निम्नलिखित संशोधन का उपयोग करता हूं: $_ argc == 2 यदि $ arg1> = $ arg0.size () - 1 प्रिंटफ "त्रुटि,% s.size () =% d, अंतिम तत्व \ n", "प्रिंट करें: print_vector को परिभाषित करें। $ arg0 ", $ arg0.size () - 1 अंत प्रिंट * ($ arg0._M_impl._M_start + $ ARG1) @ 1 और प्रिंट * ($ arg0._M_impl._M_start) @ $ arg0.size () अंत अंत
user1541776

एल मैग्निटो! mochas ग्रेसियस
truthadjustr

0

पार्टी के लिए थोड़ी देर हो गई है, इसलिए ज्यादातर अगली बार मेरे लिए एक अनुस्मारक है जो मैं इस खोज को करता हूं!

मैं उपयोग करने में सक्षम है:

p/x *(&vec[2])@4

शुरू करने से 4 तत्वों (हेक्स के रूप में) को मुद्रित vecकरने के लिए vec[2]

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.