2014-10-11 67 views
1

在我的代碼中,我有一個STL向量,它保存着指向對象的指針。 我這樣編碼的原因是因爲我必須從不同的地方操作對象本身。GDB&C++:打印對象指針的向量

std::vector<Object*> objects; 

for (int i = 0; i < 10; i++) { 
    Object* o = new Object(i); 
    objects.push_back(o); 
} 

此代碼假定Object是一個將整數作爲構造函數參數的對象。假設在for循環結束後我斷點與我的GDB斷開了,我必須做些什麼才能輕鬆查看我的向量中的對象?

當我做「p對象」時,它只列出了完全期望的指針地址,但我希望看到每個對象所保存的整數變量。我嘗試過「p objects [0]」,但是這返回「找不到運算符[]」。

有沒有人遇到過這個問題?或知道如何解決這個問題? 我的目標是當這些對象的指針存儲在STL向量中時,能夠從GDB中查看實際保存的對象。

+0

我建議有一個向量智能指針。你可以在'gdb'調試器中嘗試'p * o'或'p objects'。 – 2014-10-11 06:16:49

+0

我需要觀察指向不同地方的對象的指針的內容,做「p對象」會向我顯示所有的地址,但它們不會告訴我每個對象中的內容,以及「p objects [0 ]「也不起作用,說」無法找到運算符[]「 – user3064869 2014-10-11 06:19:47

+0

最近版本的'gdb'和[GCC](http://gcc.gnu.org/)即'g ++'可能有幫助 – 2014-10-11 06:21:14

回答

2

這肯定是實現的定義,但是對於GCC,你可以這樣做:

print **(v._M_impl._M_start)@1 

v指載體,並1是指索引。您需要解除引用兩次才能獲得該值。

struct Object 
{ 
    int n; 
    Object(int n) 
     : n(n) { } 
}; 

int main() 
{ 
    std::vector<Object*> v; 
    v.push_back(new Object{42}); 
    v.size(); // where we breakpoint 
    // release our memory at some point 
} 

而且我們的試運行:

(gdb) break 16 
Breakpoint 1 at 0x400aae: file test.cpp, line 16. 
(gdb) run 
Starting program: a.out 

Breakpoint 1, main() at test.cpp:16 
16  v.size(); // where we breakpoint 
(gdb) print v 
$1 = {<std::_Vector_base<Object*, std::allocator<Object*> >> = { 
    _M_impl = {<std::allocator<Object*>> = {<__gnu_cxx::new_allocator<Object*>> = {<No data fields>}, <No data fields>}, _M_start = 0x604030, _M_finish = 0x604038, _M_end_of_storage = 0x604038}}, <No data fields>} 
(gdb) print **(v._M_impl._M_start)@1 
$2 = {{n = 42}} 
+0

這正是我尋找的答案!是否可以從頭到尾打印?而不是索引一個元素? – user3064869 2014-10-11 06:45:35

+0

非常感謝你! – user3064869 2014-10-11 06:49:00

+0

@ user3064869不確定,'print **(v._M_impl._M_start)@ v.size()'似乎很接近,但對我無效。 – 2014-10-11 06:49:35

0

這裏是打印值一個接一個的函數:

define pv 
    set $pvPOS_ = 0 
    while $arg0._M_impl._M_start + $pvPOS_ != $arg0._M_impl._M_finish 
    print **($arg0._M_impl._M_start + $pvPOS_) 
    set $pvPOS_ = $pvPOS_ + 1 
    end 
end 

用作pv my_vec