我有一个在堆栈上声明的结构。结构如下:
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显示有关结构的无效信息的问题。
这是一个简化的例子,展示了我在尝试调试项目时遇到的一个问题。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会显示有关结构的正确信息。