访问 GDB 中的向量项
Accessing vector items in GDB
例如,我在模板中有这样的结构 class:
struct Foo{
int data;
vector<Foo*> children;
}
要打印出数据值,我可以简单地这样做:(让 bar
成为指向 Foo
的指针)
print bar->data
这很好用。但是我还想跟随 children
到另一个 Foo
。我试过了:
print bar->children[0]->data
但它不起作用。我应该如何访问矢量中的项目并在 print
中使用它?
使用 GDB 7.9 和 g++ 4.9.2,它在打印时运行良好 bar->children[0]->data
。
但是,这里还有一个访问这些元素的间接方法:
print (*(bar->children._M_impl._M_start)@bar->children.size())[0]->data
其中VECTOR._M_impl._M_start
是VECTOR的内部数组,POINTER@VECTOR.size()
用于限制指针的大小。
参考:How do I print the elements of a C++ vector in GDB?
补:
还有一个不太优雅但更通用的方式:
print bar->children[0]
你可能会得到这样的结果:
(__gnu_cxx::__alloc_traits<std::allocator<Foo*> >::value_type &) @0x603118: 0x603090
因此您可以使用上面给出的指针访问它:
print ((Foo)*0x603090).data
在 this answer 的帮助下,显式实例化向量解决了问题。
例如,
template class std::vector<double>;
template <> Foo* &std::vector<Foo*>::operator[](size_type n) noexcept
{
return this->begin()[n];
}
要使用矢量运算符[],需要模板具体化
例如,我在模板中有这样的结构 class:
struct Foo{
int data;
vector<Foo*> children;
}
要打印出数据值,我可以简单地这样做:(让 bar
成为指向 Foo
的指针)
print bar->data
这很好用。但是我还想跟随 children
到另一个 Foo
。我试过了:
print bar->children[0]->data
但它不起作用。我应该如何访问矢量中的项目并在 print
中使用它?
使用 GDB 7.9 和 g++ 4.9.2,它在打印时运行良好 bar->children[0]->data
。
但是,这里还有一个访问这些元素的间接方法:
print (*(bar->children._M_impl._M_start)@bar->children.size())[0]->data
其中VECTOR._M_impl._M_start
是VECTOR的内部数组,POINTER@VECTOR.size()
用于限制指针的大小。
参考:How do I print the elements of a C++ vector in GDB?
补:
还有一个不太优雅但更通用的方式:
print bar->children[0]
你可能会得到这样的结果:
(__gnu_cxx::__alloc_traits<std::allocator<Foo*> >::value_type &) @0x603118: 0x603090
因此您可以使用上面给出的指针访问它:
print ((Foo)*0x603090).data
在 this answer 的帮助下,显式实例化向量解决了问题。
例如,
template class std::vector<double>;
template <> Foo* &std::vector<Foo*>::operator[](size_type n) noexcept
{
return this->begin()[n];
}
要使用矢量运算符[],需要模板具体化