क्या 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...
स्रोत
2011-11-24 04:22:44
आप को अलग और के बीच जहां आकार में वृद्धि होती है और उसके बारे में अधिक जानकारी का एक छोटा सा प्रदान कोड भागों परिभाषित कर सकता हूँ (जैसे अपने कस्टम प्रकार क्या है, जो अपने आप स्मृति आदि का आवंटन करता है)? आप अभी भी वेक्टर के आवंटन() के भीतर ब्रेकपॉइंट डाल सकते हैं क्योंकि std :: वेक्टर में केवल टेम्पलेट कार्यान्वयन होना चाहिए, इसलिए स्रोत पहुंच योग्य होगा। –
मुझे पता है जहां आकार वृद्धि होता है, लेकिन आकार समारोह एक और समारोह से बाद में किसी समय कहा जाता है, यह 0 के रूप में इसके आकार की रिपोर्ट है, और मैं उन स्थानों का पता नहीं कर पा रहे। वेक्टर में डेटा संरचना के लिए पॉइंटर्स होते हैं जो स्पष्ट नए/हटाए नहीं जाते हैं। – endbegin
तो शायद यह मदद करेगा यदि आप हमें उस विशेष क्षेत्र से संबंधित कुछ कोड दिखाएंगे। अन्यथा (और पहले पोस्ट किए गए उत्तर पर आपकी टिप्पणी के संबंध में) मेरा वूडू क्लैंग केवल मुझे चुप्पी दिखाता है; ओ) –