我有一个传统的C++应用程序,它在我们使用makefiles和VS2003的命令行工具构建的最具体的应用程序中。我试图让它使用VS2008和MsBuild构建。构建工作正常,但是我遇到了以前从未见过错误的错误,并且在VS2008的调试器中逐步完成工作只会让我感到困惑。Wierdness调试Visual Studio C++ 2008
该应用程序链接的数静态库,其可分为两类:一类是相同的应用程序套件的一部分,和那些若干应用程序套件之间共享。
最初,我为每个静态库都有一个.csproj文件,还有两个.sln文件,一个用于应用程序套件(包括特定于套件的库),另一个用于非特定于套件的共享库。共享库包含在链接中,它们的项目不包含在应用程序套件.sln中。
的应用从在共享库的一个所定义的类实例化的对象。该类有一个包装链接列表的类的成员对象。链表类的构造函数将其“head”指针设置为null。
当我运行应用程序,并尝试将元素添加到链表,我得到一个错误 - 头指针包含值0xCCCCCCCC。所以我使用调试器。并看到奇怪。
当在调试器的当前行是属于静态库源文件,头指针包含00000000。当我进入构造函数时,我可以看到指针被设置为该值,并且当我走进类的任何其他方法时,我可以看到头指针仍然包含0x00000000。但是当我步入应用程序套件.sln中定义的方法时,它包含0xCCCCCCCC。这不像它被覆盖。它根据我目前正在调试的源文件来回更改。
所以,我包括在应用程序套件的.sln共享库的项目,现在我看到一个包含0xCCCCCCCC所有的时间头指针。它看起来像链接列表类的构造函数没有被调用。
所以现在,我完全困惑。有人有主意吗?
是否启用了优化来编译静态库?如果代码是通过优化编译的(例如/ Ox),则变量的内容可能不正确,或者变量可能完全丢失。这可以解释为什么在单步执行代码时看到不同的值。如果你真的想调试,不要使用优化标志。 – Patrick 2010-05-27 20:01:42