在我的代码中,我有一个 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]”,但这返回“找不到运算符[]”。
有人遇到过这个问题吗?或者知道我该如何解决这个问题? 我的目标是当这些对象的指针存储在 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
}
我们的测试运行:
(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}}
这里是一个函数,一个接一个地打印值:
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 脚本来打印 stl 容器信息,这可能会有帮助。gdbinit