GDB & C++:打印指向对象的指针向量

y3bcpkx1  于 2023-03-25  发布在  其他
关注(0)|答案(2)|浏览(232)

在我的代码中,我有一个STL向量,它保存指向对象的指针。我这样编码的原因是因为我必须从不同的地方操作对象本身。

std::vector<Object*> objects;

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

这段代码假设Object是一个接受一个整数作为构造函数参数的对象。假设我在for循环结束后用我的GDB断点,我需要做什么才能轻松地查看我的vector中的对象?
当我做“p对象”时,它只列出了指针地址,这是完全预期的,但我想看到每个对象所持有的整数变量。我尝试了“p对象[0]”,但这返回“无法找到运算符[]”。
有没有人遇到过这个问题?或者知道我如何解决这个问题?我的目标是能够从GDB中查看对象的指针存储在STL向量中时实际持有的对象。

cyvaqqii

cyvaqqii1#

这当然是实现定义的,但对于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}}
gywdnpxw

gywdnpxw2#

下面是一个函数,它一个接一个地打印值:

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

相关问题