मैं std::vector
GDB में ए की सामग्री की जांच करना चाहता हूं , मैं यह कैसे करूं? मान लीजिए कि यह std::vector<int>
सरलता के लिए है।
मैं std::vector
GDB में ए की सामग्री की जांच करना चाहता हूं , मैं यह कैसे करूं? मान लीजिए कि यह std::vector<int>
सरलता के लिए है।
जवाबों:
वेक्टर 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 का उपयोग करने वाले किसी अन्य आईडीई के साथ अच्छी तरह से काम करता है , जैसा कि मुझे लगता है)।
$HOME/.gdbinit
आवश्यक थी। फिलहाल मैं ऐसी किसी भी फाइल के साथ समाप्त नहीं हुआ हूं और gdb
सही ढंग से सामग्री दिखा रहा हूं std::vector
। हालाँकि, जब से मेरे "रिबॉकिंग" के प्रयासों के दौरान मैंने बस स्थापित किया और फिर बिना किसी बाधा के cgdb
, और मैंने पहले ही libstdc++5
स्थापित कर दिया था, मुझे नहीं पता कि सुंदर छपाई क्यों काम नहीं करती थी जबकि अब यह काम करती है।
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
Cannot evaluate function -- may be inlined
_M_impl
GDB के तहत अपने संकलक 7.0+, उपयोग के लिए आदि)print /r myVector
डिबगिंग करते समय एसटीएल कंटेनरों को 'देखना' एक समस्या है। यहां 3 अलग-अलग समाधान हैं जो मैंने अतीत में उपयोग किए हैं, उनमें से कोई भी सही नहीं है।
1) http://clith.com/gdb_stl_utils/ से GDB स्क्रिप्ट का उपयोग करें। ये स्क्रिप्ट आपको लगभग सभी STL कंटेनरों की सामग्री प्रिंट करने की अनुमति देती हैं। समस्या यह है कि यह सेट के ढेर की तरह नेस्टेड कंटेनरों के लिए काम नहीं करता है।
2) विजुअल स्टूडियो 2005 में एसटीएल कंटेनरों को देखने के लिए शानदार समर्थन है। यह नेस्टेड कंटेनरों के लिए काम करता है, लेकिन यह केवल एसटीएल के लिए उनके कार्यान्वयन के लिए है और अगर आप बोएल कंटेनर में एसटीएल कंटेनर डाल रहे हैं तो यह काम नहीं करता है।
3) डिबगिंग करते समय आप जिस विशिष्ट आइटम को प्रिंट करना चाहते हैं, उसके लिए अपना 'प्रिंट' फ़ंक्शन (या विधि) लिखें और आइटम को प्रिंट करने के लिए जीडीबी में 'कॉल' का उपयोग करें। ध्यान दें कि यदि आपका प्रिंट फ़ंक्शन कहीं भी नहीं बुलाया जा रहा है तो कोड g ++ मृत कोड उन्मूलन करेगा और GDB द्वारा 'प्रिंट' फ़ंक्शन नहीं मिलेगा (आपको यह कहते हुए एक संदेश मिलेगा कि फ़ंक्शन इनबिल्ड है)। इसलिए -fkeep-inline-functions को संकलित करें
निम्नलिखित को ~ / .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'}}