【问题标题】:GDB & C++: Printing vector of pointers to objectsGDB & C++:打印指向对象的指针向量
【发布时间】:2014-10-11 06:09:14
【问题描述】:

在我的代码中,我有一个 STL 向量,其中包含指向对象的指针。 我之所以这样编码,是因为我必须从不同的地方操作对象本身。

std::vector<Object*> objects;

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

此代码假设 Object 是一个接受整数作为构造函数参数的对象。假设我在 for 循环结束后使用 GDB 断点,我必须做什么才能轻松查看向量中的对象?

当我执行“p objects”时,它只列出完全预期的指针地址,但我想查看每个对象所包含的整数变量。我尝试了“p objects[0]”,但这返回“Could not find operator[]”。

有人遇到过这个问题吗?或者知道我该如何解决这个问题? 我的目标是当对象的指针存储在 STL 向量中时,能够查看 GDB 中实际保存的对象。

【问题讨论】:

  • 我建议使用智能指针向量。您可以在gdb 调试器中尝试p *op objects
  • 我需要观察指向来自不同地方的对象的指针向量中的内容,并且执行“p objects”将显示所有地址,但它们不会显示每个对象中包含的内容, 并且 "p objects[0]" 也不起作用,说 "Could not find operator[]"
  • gdbGCC 的最新版本,即g++ 可能会有所帮助
  • @user3064869 许多答案建议使用pretty printer
  • @remyabel 我的 gdbinit 中有这个,它告诉我向量中包含的所有指针地址,因为它被编码为保存指向对象的指针。

标签: c++ pointers vector stl gdb


【解决方案1】:

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

【讨论】:

  • 这正是我正在寻找的答案!可以从头到尾打印吗?而不是索引一个元素?
  • @user3064869 不确定,print **(v._M_impl._M_start)@v.size() 似乎很接近,但对我不起作用。
  • 实际上,准确地显示所有元素是行不通的。只有第一个元素看起来有效,其余元素的字段值很荒谬。
  • @user3064869 作为一种解决方法,您可以使用print **(v._M_impl._M_start + 1)print **(v._M_impl._M_start + 2)...
  • 这行得通,但必须为向量的所有条目输入它。没有在一个命令中打印指向对象的完整指针向量的标准方法吗?人们不会遇到这个问题吗?
【解决方案2】:

这是一个依次打印值的函数:

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

【讨论】:

    猜你喜欢
    • 2011-10-01
    • 2011-02-11
    • 1970-01-01
    • 2021-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-20
    • 1970-01-01
    相关资源
    最近更新 更多