2014-10-11 66 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