2011-11-23 100 views
19

我有一個std :: vector作爲類的一部分,它包含一個自定義類型。它的內容似乎在程序中某處發生了神祕的變化。我無法弄清楚發生了什麼。如何在gdb中「觀察」C++ std :: vector的大小?

有沒有辦法從gdb中「觀察」std :: vector的內容(或大小)?

謝謝。

+0

您可以隔離並定義尺寸的增加發生在那裏,並提供更多的信息,一點點的部分代碼(例如,什麼是你的自定義類型,它本身分配內存等)?你仍然可以在vector的allocate()中放置一個斷點,因爲std :: vector應該只有一個模板實現,所以源應該是可訪問的。 –

+0

我知道尺寸增加發生的地方,但是當尺寸函數稍後被另一個函數調用時,它會將其大小報告爲0,我似乎無法弄清楚在哪裏。該向量包含指向不執行顯式新建/刪除的數據結構的指針。 – endbegin

+0

那麼,如果你向我們展示了關於該特定區域的一些代碼,那麼它可能會有所幫助。否則(關於你對第一個發佈的答案的評論)我的巫毒鏗鏘聲只會讓我沉默; o) –

回答

10

有沒有辦法從gdb中「觀察」std :: vector的內容(或大小)?

假設您正在使用GCC,請在theVector->_M_impl._M_start_M_finish上設置觀察點。如果您正在使用其他std :: vector實現,請相應地進行調整。

例子:

#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

你能解釋你的方法,因爲我仍然不明白你的方法嗎?非常感謝。 –