踩着gdb似乎表明程序语句没有任何效果

时间:2012-02-22 09:37:35

标签: c++ debugging gdb stdvector

我有一个在堆栈上声明的结构。这是结构的样子:

struct MyStruct {
    int integer;
    std::vector<bool > booleanVector;
};

当我使用gdb逐步执行以下函数,打印s.integers.booleanVector.size()的值时,这些语句似乎没有效果。

MyStruct getMyStruct()
{
    MyStruct s;   
    s.integer = 3;
    s.booleanVector.resize( s.integer );
    return s;
}

但是,当我插入std::cout << s.integer << std::endl;等打印语句时,输出显示s.integers.booleanVector.size()的值已正确更改。

我发现问题似乎与声明它的函数返回的结构有关。如果gdb显示有关结构的无效信息的问题,如果它未被声明它的函数返回,则不会发生。

这是一个简化的示例,表明我在尝试调试项目时遇到的问题。 gdb的这个问题让我分散了我的代码中的实际错误并使其难以找到(最初我认为问题可能是我的代码中的一个微妙的错误,这就是我在这里发布的原因)。 Here是一个完整的小程序,在我的系统上展示了这种行为。

我想我的问题是,如果这只是gdb的一个错误,或者由于gcc如何处理从函数返回的结构/类而导致出现此行为。

注意:在Mac OSX 10.6(Snow Leopard)中使用gdb 6.3和gcc 4.2

2 个答案:

答案 0 :(得分:2)

这是海湾合作委员会的一个错误(见下面的链接)。

使用以下GDB版本时也会发生这种情况:

  

i686-apple-darwin9-g ++ - 4.0.1(GCC)4.0.1(Apple Inc. build 5493)   版权所有(C)2005 Free Software Foundation,Inc。

...甚至在使用-O0

进行编译时

以下是GCC项目中完整错误跟踪器的链接:

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44731

生成的程序是正确运行的程序。问题完全与优化相关,即使将构建集设置为“零优化”,以及通过gcc将不正确的调试信息放入二进制文件中也会产生影响。

答案 1 :(得分:1)

通过升级到更新版本的gcc可以解决此调试问题。当使用gcc 4.7编译代码时,gdb会显示有关struct的正确信息。