【发布时间】:2010-05-27 19:55:17
【问题描述】:
我有一个遗留的 C++ 应用程序,它的最典型版本是我们使用 makefile 和 VS2003 的命令行工具构建的。我正在尝试使用 VS2008 和 MsBuild 来构建它。构建工作正常,但我遇到了以前从未见过的错误,并且在 VS2008 的调试器中单步执行只会让我感到困惑。
该应用程序链接了许多静态库,这些库分为两类:属于同一应用程序套件的那些,以及在多个应用程序套件之间共享的那些。
最初,我为每个静态库创建了一个 .csproj 文件和两个 .sln 文件,一个用于应用程序套件(包括特定于套件的库),一个用于非套件特定的共享库。共享库包含在链接中,它们的项目未包含在应用程序套件 .sln 中。
应用程序从一个共享库中定义的类实例化一个对象。该类具有包装链表的类的成员对象。链表类的构造函数将其“头”指针设置为空。
当我运行应用程序并尝试将元素添加到链表时,我收到一个错误 - 头指针包含值 0xCCCCCCCC。所以我使用调试器逐步完成。并看到奇怪。
当调试器中的当前行在属于静态库的源文件中时,头指针包含0x00000000。当我进入构造函数时,我可以看到指针被设置为该值,当我进入该类的任何其他方法时,我可以看到头指针仍然包含 0x00000000。但是当我进入应用程序套件 .sln 中定义的方法时,它包含 0xCCCCCCCC。这不像是被覆盖了。它会根据我当前正在调试的源文件来回更改。
所以我将共享库的项目包含在应用程序套件 .sln 中,现在我一直看到包含 0xCCCCCCCC 的头指针。好像没有调用链表类的构造函数。
所以现在,我完全糊涂了。有人有什么想法吗?
【问题讨论】:
-
静态库编译是否启用优化?如果代码是用优化编译的(例如 /Ox),变量的内容可能不正确或者变量可能完全丢失。这可以解释为什么您在单步执行代码时会看到不同的值。如果你真的想调试,不要使用优化标志。