2008-11-26 2 views
15

मैं gdb में std :: vector की सामग्री की जांच करना चाहता हूं लेकिन मेरे पास _M_impl तक पहुंच नहीं है क्योंकि मैं आईसीसी का उपयोग कर रहा हूं, जीसीसी नहीं, मैं इसे कैसे कर सकता हूं? आइए मान लें कि सादगी के लिए यह एक std :: वेक्टर है।आईसीसी कंपाइलर का उपयोग करते हुए, मैं gdb में std :: वेक्टर की सामग्री की जांच कैसे करूं?

एक बहुत अच्छा जवाब here है लेकिन अगर मैं आईसीसी का उपयोग करता हूं तो यह काम नहीं करता है, त्रुटि संदेश "कोई सदस्य या विधि _M_impl नाम नहीं है"। ऐसा लगता है कि एक अच्छा डीबग टूलसेट here है लेकिन यह _M_impl पर भी निर्भर करता है।

+2

+1 7 साल बाद शर्मनाक शर्मनाक, जीडीबी अभी भी कंटेनरों को उचित तरीके से प्रदर्शित नहीं कर सकता है। यहां तक ​​कि तार भी नहीं ... –

+0

कोई आईसीसी प्रतिबंध नहीं: https://stackoverflow.com/questions/253099/how-do-i-print-the-elements-of-ac-vector-in-gdb –

उत्तर

10

सुनिश्चित नहीं है कि यह आपके वेक्टर के साथ काम करेगा, लेकिन यह मेरे लिए काम करता है।

#include <string> 
#include <vector> 

int main() { 
    std::vector<std::string> vec; 
    vec.push_back("Hello"); 
    vec.push_back("world"); 
    vec.push_back("!"); 
    return 0; 
} 

gdb:

(gdb) break source.cpp:8 
(gdb) run 
(gdb) p vec.begin() 
$1 = { 
    _M_current = 0x300340 
} 
(gdb) p $1._M_current->c_str() 
$2 = 0x3002fc "Hello" 
(gdb) p $1._M_current +1 
$3 = (string *) 0x300344 
(gdb) p $3->c_str() 
$4 = 0x30032c "world" 
0

std::vector टेम्पलेट guarantees the data is stored contiguously। यदि आप सामने के तत्व का पता लेते हैं (उदाहरण के लिए, &v[0]), तो आप सी-स्टाइल सरणी के माध्यम से वेक्टर में किसी भी अन्य तत्व तक पहुंच सकते हैं। इसके लिए आपको अपने डीबगर पर उपलब्ध एसटीएल का स्रोत कोड प्राप्त करने की आवश्यकता नहीं है।


इस से कुछ के साथ खिलवाड़ करने के बाद, ऐसा लगता है कि v.front() और v.begin() संभावना inlined कर रहे हैं और GDB उन्हें नहीं मिल रहा है। मैं देख रहा हूं, लेकिन व्यक्तिगत रूप से मैं बस स्रोत फ़ाइल में int* i = &v[0] लाइन जोड़ता हूं, और फिर डीबगिंग करते समय i पर जीडीबी कमांड का उपयोग करता हूं। ध्यान दें कि संकलक उस मृत कोड को हटाने के लिए स्वतंत्र है। इससे बचने के लिए आपको i के मान को आउटपुट करने की आवश्यकता हो सकती है, या ऑप्टिमाइज़ेशन को क्रैंक नहीं किया जा सकता है।

+0

मैं कैसे पहुंच सकता हूं पहला तत्व? myvector [0] gdb में काम नहीं करता ..? –

+0

आपकी मदद के लिए धन्यवाद। gdb मुझे प्रिंट लाइन पर myvector.front() को कॉल करने नहीं देता है? -> विधि std :: vector > :: फ्रंट –

+0

क्षमा करें, पिछली बार मैंने gdb में सदस्य फ़ंक्शंस को कॉल करने का प्रयास किया था, मुझे नाम-नामित नाम (जो है , प्रतीक जो वास्तव में बाइनरी में दिखाई देता है)। मुझे यकीन है कि वे इसे अब तक तय कर चुके हैं। और v [0] और (v.front()) से अधिक देखने के लिए अधिक आम है, इसलिए मैंने इसका उपयोग करने के लिए उत्तर बदल दिया है। –

3

आम तौर पर जब मैं एक डिबगर में कंटेनर क्लासों के साथ सौदा है, मैं एलीमेंट का एक संदर्भ,, निर्माण एक स्थानीय चर के रूप में तो यह डीबगर में देखना आसान है कंटेनर कार्यान्वयन में उलझन के बिना।

यहां एक समेकित उदाहरण है।

vector<WeirdStructure> myWeird; 

/* push back a lot of stuff into the vector */ 

size_t z; 
for (z = 0; z < myWeird.size(); z++) 
{ 
    WeirdStructure& weird = myWeird[z]; 

    /* at this point weird is directly observable by the debugger */ 

    /* your code to manipulate weird goes here */ 
} 

यह मुहावरे मैं उपयोग करता हूं।

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