2010-05-27 177 views
1

我有一个传统的C++应用程序,它在我们使用makefiles和VS2003的命令行工具构建的最具体的应用程序中。我试图让它使用VS2008和MsBuild构建。构建工作正常,但是我遇到了以前从未见过错误的错误,并且在VS2008的调试器中逐步完成工作只会让我感到困惑。Wierdness调试Visual Studio C++ 2008

该应用程序链接的数静态库,其可分为两类:一类是相同的应用程序套件的一部分,和那些若干应用程序套件之间共享。

最初,我为每个静态库都有一个.csproj文件,还有两个.sln文件,一个用于应用程序套件(包括特定于套件的库),另一个用于非特定于套件的共享库。共享库包含在链接中,它们的项目不包含在应用程序套件.sln中。

的应用从在共享库的一个所定义的类实例化的对象。该类有一个包装链接列表的类的成员对象。链表类的构造函数将其“head”指针设置为null。

当我运行应用程序,并尝试将元素添加到链表,我得到一个错误 - 头指针包含值0xCCCCCCCC。所以我使用调试器。并看到奇怪。

当在调试器的当前行是属于静态库源文件,头指针包含00000000。当我进入构造函数时,我可以看到指针被设置为该值,并且当我走进类的任何其他方法时,我可以看到头指针仍然包含0x00000000。但是当我步入应用程序套件.sln中定义的方法时,它包含0xCCCCCCCC。这不像它被覆盖。它根据我目前正在调试的源文件来回更改。

所以,我包括在应用程序套件的.sln共享库的项目,现在我看到一个包含0xCCCCCCCC所有的时间头指针。它看起来像链接列表类的构造函数没有被调用。

所以现在,我完全困惑。有人有主意吗?

+0

是否启用了优化来编译静态库?如果代码是通过优化编译的(例如/ Ox),则变量的内容可能不正确,或者变量可能完全丢失。这可以解释为什么在单步执行代码时看到不同的值。如果你真的想调试,不要使用优化标志。 – Patrick 2010-05-27 20:01:42

回答

5

这是当你混合并用不同版本的CRT头文件的内置匹配代码常见事故。 2003年到2008年间有很多变化。例如STL迭代器调试。 RTC功能(运行时错误检查)将是另一个,这是您看到的0xcccccccc值的来源。它的意思是“未初始化的变量”。你看到这个是因为struct或class的内存布局不一样。

您将不得不重建这些库,并确保它们使用相同的编译器设置构建。另外请确保不要混合调试和发布构建版本。

+0

似乎确实如此。我试过从IDE中“重建”,问题依然存在。我用旧的makefile“make clean”,删除所有的二进制文件,并从IDE做了一个构建,现在事情都很好。 谢谢。 – 2010-05-27 21:57:23