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

C++ GDB&;C++;:打印指向对象的指针向量,c++,pointers,vector,stl,gdb,C++,Pointers,Vector,Stl,Gdb,在我的代码中,我有一个STL向量,它保存指向对象的指针。 我之所以这样编码,是因为我必须从不同的地方操纵对象本身 std::vector<Object*> objects; for (int i = 0; i < 10; i++) { Object* o = new Object(i); objects.push_back(o); } std::向量对象; 对于(int i=0;i

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

std::vector<Object*> objects;

for (int i = 0; i < 10; i++) {
    Object* o = new Object(i);
    objects.push_back(o);
}
std::向量对象;
对于(int i=0;i<10;i++){
对象*o=新对象(i);
对象。推回(o);
}
这段代码假设对象是一个接受整数作为构造函数参数的对象。假设我在for循环结束后使用GDB设置断点,为了方便地查看向量中的对象,我必须做什么

当我使用“p objects”时,它只列出了完全需要的指针地址,但我希望看到每个对象也包含整数变量。我尝试了“p对象[0]”,但返回“找不到运算符[]”

有人遇到过这个问题吗?或者你知道我该怎么做吗?
我的目标是,当对象的指针存储在STL向量中时,能够查看GDB中实际包含的对象。

这当然是实现定义的,但对于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
}
struct对象
{
int n;
对象(int n)
:n(n){}
};
int main()
{
std::向量v;
v、 推回(新对象{42});
v、 size();//断点所在的位置
//在某个时刻释放我们的记忆
}
以及我们的测试运行:

(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}}
(gdb)中断16
0x400aae处的断点1:文件test.cpp,第16行。
(gdb)运行
启动程序:a
test.cpp:16处的断点1,main()
16 v.尺寸();//我们在哪里找到断点
(gdb)打印v
$1 = { = {
_M_impl={={},},_M_start=0x604030,_M_finish=0x604038,_end_of_storage=0x604038},}
(gdb)打印**(v.。_M____执行开始)@1
$2={{n=42}

这当然是实现定义的,但对于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
}
struct对象
{
int n;
对象(int n)
:n(n){}
};
int main()
{
std::向量v;
v、 推回(新对象{42});
v、 size();//断点所在的位置
//在某个时刻释放我们的记忆
}
以及我们的测试运行:

(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}}
(gdb)中断16
0x400aae处的断点1:文件test.cpp,第16行。
(gdb)运行
启动程序:a
test.cpp:16处的断点1,main()
16 v.尺寸();//我们在哪里找到断点
(gdb)打印v
$1 = { = {
_M_impl={={},},_M_start=0x604030,_M_finish=0x604038,_end_of_storage=0x604038},}
(gdb)打印**(v.。_M____执行开始)@1
$2={{n=42}

这里有一个函数,可以一个接一个地打印值:

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

这里有一个函数,可以一个接一个地打印值:

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

我建议使用智能指针向量。您可以在
gdb
调试器中尝试
p*o
p objects
。我需要观察从不同位置指向对象的指针向量中的内容,执行“p objects”将显示所有地址,但它们不会显示每个对象中包含的内容,“p objects[0]”也不起作用“找不到运算符[]“最新版本的
gdb
g++
可能help@user3064869很多答案都建议使用@remyabel我的gdbinit中有这个,它告诉我向量中包含的所有指针地址,因为它被编码用来保存指向对象的指针。我建议使用智能指针向量。您可以在
gdb
调试器中尝试
p*o
p objects
。我需要观察从不同位置指向对象的指针向量中的内容,执行“p objects”将显示所有地址,但它们不会显示每个对象中包含的内容,“p objects[0]”也不起作用“找不到运算符[]“最新版本的
gdb
g++
可能help@user3064869很多答案都建议使用。@remyabel我的gdbinit中有这个,它告诉我向量中包含的所有指针地址,因为它被编码用来保存指向对象的指针。这正是我想要的答案!!可以从头到尾打印吗?不是索引一个元素?@user3064869不确定,
print**(v.。\u M\u impl.\u M\u start)@v.size()
似乎很接近,但对我不起作用。实际上,准确显示所有元素并不起作用。只有第一个元素看起来是有效的,元素的其余字段的值都是荒谬的。@user3064869作为一种解决方法,您可以执行
print**(v.\M\u impl.\M\u start+1)
print**(v.\M\u impl.\M\u start+2)
…这是有效的,但必须为向量的所有条目键入它。没有标准的方法在一个命令中打印指向对象的指针的完整向量?人们不会遇到这个问题吗?这正是我想要的答案!!可以从头到尾打印吗?不是索引一个元素?@user3064869不确定,
print**(v.。\u M\u impl.\u M\u start)@v.size()
似乎很接近,但对我不起作用。实际上,准确显示所有元素并不起作用。只有第一个元素看起来是有效的,元素的其余字段的值都是荒谬的。@user3064869作为一种解决方法,您可以执行
print**(v.\M\u impl.\M\u start+1)
print**(v.\M\u impl.\M\u start+2)
…这是有效的,但必须为向量的所有条目键入它。没有标准的方法在一个命令中打印指向对象的指针的完整向量?人们不会遇到这个问题吗?