我有一个在堆栈上声明的结构。这是结构的样子:
struct MyStruct {
int integer;
std::vector<bool > booleanVector;
};
当我使用gdb逐步执行以下函数,打印s.integer
和s.booleanVector.size()
的值时,这些语句似乎没有效果。
MyStruct getMyStruct()
{
MyStruct s;
s.integer = 3;
s.booleanVector.resize( s.integer );
return s;
}
但是,当我插入std::cout << s.integer << std::endl;
等打印语句时,输出显示s.integer
和s.booleanVector.size()
的值已正确更改。
我发现问题似乎与声明它的函数返回的结构有关。如果gdb显示有关结构的无效信息的问题,如果它未被声明它的函数返回,则不会发生。
这是一个简化的示例,表明我在尝试调试项目时遇到的问题。 gdb的这个问题让我分散了我的代码中的实际错误并使其难以找到(最初我认为问题可能是我的代码中的一个微妙的错误,这就是我在这里发布的原因)。 Here是一个完整的小程序,在我的系统上展示了这种行为。
我想我的问题是,如果这只是gdb的一个错误,或者由于gcc如何处理从函数返回的结构/类而导致出现此行为。
注意:在Mac OSX 10.6(Snow Leopard)中使用gdb 6.3和gcc 4.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的正确信息。