GDB监视实例向量中的类成员
GDB watching class member in vector of instances
这是我的类的一个极其简化的版本:
Class MyClass {
public:
int sizeDesired;
};
我正在main中创建MyClass
实例的矢量:
int main(int argc, char **argv) {
std::vector<MyClass> myvec;
for(int i=0; i<10; ++i)
myvec.push_back(MyClass());
for(int i=0; i<myvec.size(); ++i)
doWork(myvec[i]);
return 0;
}
有一些内存损坏(我认为)错误导致我的程序崩溃。我观察到,当程序崩溃时,MyClass::sizeDesired
的值是垃圾。所以,我想在每个MyClass:sizeDesired
成员上设置一个观察点,这样我就可以准确地看到任何这些成员的值何时发生变化。
使用GDB,我如何做到这一点?
当我将MyClass
的所有实例推入main中的std::vector<MyClass>
后中断时,然后执行
(gdb) watch myvec[0].sizeDesired
但是GDB只是挂起。它不显示一个新的命令提示符(即,它不显示(gdb)
在后面的行…只是一个空白行,似乎什么也没有发生)。
我对非基于gdb的解决方案持开放态度。如果这种类型的检查/监视在GDB中是不可能的,是否有可以使用的替代工具?
我没有在gdb中做过多的c++调试,所以这些可能都是众所周知的问题。
观察点的问题似乎是由gdb无法实际执行某些方法引起的,例如[]操作符或at()方法。您可以通过输入print myvec.at(0)来尝试。看起来这个测试在观察点代码中丢失了,它冻结了gdb。(这可能是已知的gdb错误,但我会检查。)
现在是解决方法。可以使用
访问vector的第n个元素:(MyClass*)(myvec._M_impl._M_start+n)
For sizeDesired则为:
(((MyClass*)(myvec._M_impl._M_start+n))->sizeDesired)
在这个表达式中添加一个观察点仍然会因为某些原因冻结gdb。但是打印工作,所以如果你这样做:
print &(((MyClass*)(myvec._M_impl._M_start+3))->sizeDesired)
您将获得指向您想要监视的字段的指针。像这样的东西会被打印出来:$1 = (int *) 0x40508c现在的问题:
watch *((int*)0x40508c)
continue
硬件访问(读/写)观察点3:((int)0x40508c)…
BTW:如何打印std容器的想法是从http://sourceware.org/ml/gdb/2008-02/msg00064/stl-views.gdb.
- C++:从其他类访问结构的私有成员向量
- 访问类成员向量最后一项的正确方法
- 将字符串推送到私有成员向量
- 访问其他类中多个对象的私有成员向量
- 如何在类的构造函数中定义成员向量的大小
- 如何对类成员向量进行排序
- 从向量中擦除元素是否也会擦除元素中存在的所有成员向量
- 尝试从成员函数推送时不维护元素的成员向量
- C++ |无法将项添加到类成员向量
- 如何创建过滤流的成员向量
- 使用大型数据集初始化类成员向量的最有效方法
- 将C 成员向量包裹为Python命令
- 尝试保存到成员向量的连接-一次只保存一个
- 类成员向量上的迭代器未正确取消引用
- 如何在c++11中返回类成员向量
- 初始化构造函数C++中的成员向量
- 将类成员向量的内容复制到另一个向量中,然后将其交换回
- 推送到成员向量时的隔离错误
- 在堆上创建多态对象的数据成员向量
- 将此指针推回专用静态成员向量