【问题标题】:Wierdness debugging Visual Studio C++ 2008奇怪的调试 Visual Studio C++ 2008
【发布时间】:2010-05-27 19:55:17
【问题描述】:

我有一个遗留的 C++ 应用程序,它的最典型版本是我们使用 makefile 和 VS2003 的命令行工具构建的。我正在尝试使用 VS2008 和 MsBuild 来构建它。构建工作正常,但我遇到了以前从未见过的错误,并且在 VS2008 的调试器中单步执行只会让我感到困惑。

该应用程序链接了许多静态库,这些库分为两类:属于同一应用程序套件的那些,以及在多个应用程序套件之间共享的那些。

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

应用程序从一个共享库中定义的类实例化一个对象。该类具有包装链表的类的成员对象。链表类的构造函数将其“头”指针设置为空。

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

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

所以我将共享库的项目包含在应用程序套件 .sln 中,现在我一直看到包含 0xCCCCCCCC 的头指针。好像没有调用链表类的构造函数。

所以现在,我完全糊涂了。有人有什么想法吗?

【问题讨论】:

  • 静态库编译是否启用优化?如果代码是用优化编译的(例如 /Ox),变量的内容可能不正确或者变量可能完全丢失。这可以解释为什么您在单步执行代码时会看到不同的值。如果你真的想调试,不要使用优化标志。

标签: c++ visual-studio-2008


【解决方案1】:

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

您必须重新构建这些库并确保它们是使用相同的编译器设置构建的。还要确保不要混合调试和发布构建版本。

【讨论】:

  • 似乎就是这样。我曾尝试从 IDE 中“重建”,但问题仍然存在。我对旧的 makefile 使用了“make clean”,删除了所有二进制文件,并从 IDE 进行了构建,现在一切都很好。谢谢。
猜你喜欢
  • 1970-01-01
  • 2011-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多