2011-11-23 10 views
19

मैं एक वर्ग है, जो किसी कस्टम प्रकार हैं के हिस्से के रूप में एक std :: वेक्टर है। प्रतीत होता है कि इसकी सामग्री प्रोग्राम में कहीं से रहस्यमय रूप से बदल गई है। मुझे यह पता लगाने में परेशानी हो रही है कि यह कहां हो रहा है।जीडीबी में सी ++ std :: वेक्टर के आकार को "घड़ी" कैसे करें?

वहाँ एक रास्ता के लिए एक std :: gdb से वेक्टर की सामग्रियों (या आकार) "घड़ी" है?

धन्यवाद।

+0

आप को अलग और के बीच जहां आकार में वृद्धि होती है और उसके बारे में अधिक जानकारी का एक छोटा सा प्रदान कोड भागों परिभाषित कर सकता हूँ (जैसे अपने कस्टम प्रकार क्या है, जो अपने आप स्मृति आदि का आवंटन करता है)? आप अभी भी वेक्टर के आवंटन() के भीतर ब्रेकपॉइंट डाल सकते हैं क्योंकि std :: वेक्टर में केवल टेम्पलेट कार्यान्वयन होना चाहिए, इसलिए स्रोत पहुंच योग्य होगा। –

+0

मुझे पता है जहां आकार वृद्धि होता है, लेकिन आकार समारोह एक और समारोह से बाद में किसी समय कहा जाता है, यह 0 के रूप में इसके आकार की रिपोर्ट है, और मैं उन स्थानों का पता नहीं कर पा रहे। वेक्टर में डेटा संरचना के लिए पॉइंटर्स होते हैं जो स्पष्ट नए/हटाए नहीं जाते हैं। – endbegin

+0

तो शायद यह मदद करेगा यदि आप हमें उस विशेष क्षेत्र से संबंधित कुछ कोड दिखाएंगे। अन्यथा (और पहले पोस्ट किए गए उत्तर पर आपकी टिप्पणी के संबंध में) मेरा वूडू क्लैंग केवल मुझे चुप्पी दिखाता है; ओ) –

उत्तर

10

क्या gdb से std :: vector की सामग्री (या आकार) को "देखने" का कोई तरीका है?

मान लीजिए कि आप जीसीसी का उपयोग कर रहे हैं, theVector->_M_impl._M_start और _M_finish पर वॉचपॉइंट सेट करें। यदि आप कुछ अन्य std :: वेक्टर कार्यान्वयन का उपयोग कर रहे हैं, तदनुसार समायोजित करें।

उदाहरण:

#include <vector> 

int main() 
{ 
    std::vector<int> v; 

    v.push_back(1); 
    v.push_back(2); 
} 

g++ -g t.cc 
gdb -q ./a.out 

Reading symbols from /tmp/a.out...done. 
(gdb) start 
Temporary breakpoint 1 at 0x40090f: file t.cc, line 5. 

Temporary breakpoint 1, main() at t.cc:5 
5  std::vector<int> v; 
(gdb) n 
7  v.push_back(1); 
(gdb) p v._M_impl._M_start 
$1 = (int *) 0x0 
(gdb) p v._M_impl._M_finish 
$2 = (int *) 0x0 
(gdb) p &v._M_impl._M_finish 
$3 = (int **) 0x7fffffffd878 
(gdb) watch *$3 
Hardware watchpoint 2: *$3 
(gdb) p &v._M_impl._M_start 
$4 = (int **) 0x7fffffffd870 
(gdb) watch *$4 
Hardware watchpoint 3: *$4 
(gdb) c 
Hardware watchpoint 3: *$4 

Old value = (int *) 0x0 
New value = (int *) 0x604010 
std::vector<int, std::allocator<int> >::_M_insert_aux (this=0x7fffffffd870, __position=0x0) at /usr/include/c++/4.4/bits/vector.tcc:365 
365  this->_M_impl._M_finish = __new_finish; 
(gdb) bt 
#0 std::vector<int, std::allocator<int> >::_M_insert_aux (this=0x7fffffffd870, __position=0x0) at /usr/include/c++/4.4/bits/vector.tcc:365 
#1 0x0000000000400a98 in std::vector<int, std::allocator<int> >::push_back (this=0x7fffffffd870, [email protected]) at /usr/include/c++/4.4/bits/stl_vector.h:741 
#2 0x0000000000400935 in main() at t.cc:7 
(gdb) c 
Hardware watchpoint 2: *$3 

Old value = (int *) 0x0 
New value = (int *) 0x604014 
std::vector<int, std::allocator<int> >::_M_insert_aux (this=0x7fffffffd870, __position=0x0) at /usr/include/c++/4.4/bits/vector.tcc:366 
366  this->_M_impl._M_end_of_storage = __new_start + __len; 
(gdb) bt 
#0 std::vector<int, std::allocator<int> >::_M_insert_aux (this=0x7fffffffd870, __position=0x0) at /usr/include/c++/4.4/bits/vector.tcc:366 
#1 0x0000000000400a98 in std::vector<int, std::allocator<int> >::push_back (this=0x7fffffffd870, [email protected]) at /usr/include/c++/4.4/bits/stl_vector.h:741 
#2 0x0000000000400935 in main() at t.cc:7 

... etc... 
+0

आप अपने विधि detial में के बाद से मैं अभी भी अपने विधि नहीं समझ सकता है समझा सकते हैं? बहुत बहुत धन्यवाद। –

1

मुझे लगता है कि http://sourceware.org/gdb/wiki/STLSupport उपयोगी होगा।

+0

मुझे लगता है कि कोशिश की, लेकिन सब मैं बटोरने सकता है एक तरह से करने के लिए बहुत-प्रिंट एक std :: वेक्टर वहाँ है। सुनिश्चित नहीं हैं कि यह हालांकि कैसे को देखने के लिए ... – endbegin

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