使用gdb似乎表明程序语句没有任何效果



我有一个在堆栈上声明的结构。结构如下:

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显示有关结构的无效信息的问题。

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

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

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

这是GCC中的一个错误(请参阅下面的链接)。

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

i686-apple-darwin9-g++-4.0.1(GCC)4.0.1(apple股份有限公司版本5493)版权所有(C)2005自由软件基金会,股份有限公司

甚至在使用-O0 进行编译时

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

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

生成的程序正在正确运行程序。这个问题完全与优化有关,即使构建设置为"零优化",优化也会产生效果,也与gcc在二进制文件中放入的调试信息不正确有关。

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

相关内容

最新更新