我有一個std :: vector作爲類的一部分,它包含一個自定義類型。它的內容似乎在程序中某處發生了神祕的變化。我無法弄清楚發生了什麼。如何在gdb中「觀察」C++ std :: vector的大小?
有沒有辦法從gdb中「觀察」std :: vector的內容(或大小)?
謝謝。
我有一個std :: vector作爲類的一部分,它包含一個自定義類型。它的內容似乎在程序中某處發生了神祕的變化。我無法弄清楚發生了什麼。如何在gdb中「觀察」C++ std :: vector的大小?
有沒有辦法從gdb中「觀察」std :: vector的內容(或大小)?
謝謝。
有沒有辦法從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...
你能解釋你的方法,因爲我仍然不明白你的方法嗎?非常感謝。 –
我試過了,但我可以從那裏蒐集到一個漂亮的方法來打印一個std :: vector。不知道如何看它雖然... – endbegin
您可以隔離並定義尺寸的增加發生在那裏,並提供更多的信息,一點點的部分代碼(例如,什麼是你的自定義類型,它本身分配內存等)?你仍然可以在vector的allocate()中放置一個斷點,因爲std :: vector應該只有一個模板實現,所以源應該是可訪問的。 –
我知道尺寸增加發生的地方,但是當尺寸函數稍後被另一個函數調用時,它會將其大小報告爲0,我似乎無法弄清楚在哪裏。該向量包含指向不執行顯式新建/刪除的數據結構的指針。 – endbegin
那麼,如果你向我們展示了關於該特定區域的一些代碼,那麼它可能會有所幫助。否則(關於你對第一個發佈的答案的評論)我的巫毒鏗鏘聲只會讓我沉默; o) –