GDB监视实例向量中的类成员



这是我的类的一个极其简化的版本:

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.

最新更新