【问题标题】:VS2010 Express recommends optimizations in debug mode, and fails running the app without themVS2010 Express 建议在调试模式下进行优化,没有它们就无法运行应用程序
【发布时间】:2012-11-19 10:43:43
【问题描述】:

我们最近遇到了 VS2010 Express C++ 的一个非常奇怪的行为。

我们运行完美的应用程序在调试模式下突然出现意外行为,例如以某种方式呈现到全屏,尽管它是一个很小的编辑器窗口。

我们发现可以通过将调试模式中的代码优化从“停用”(/Od)切换到“项目默认”来禁用新行为,然后意外使用“最大化速度”选项(/氧气)。

如果不是因为代码重构而现在几乎不可能进行调试,那么这还不错,所以断点、单步执行、查看值都是没有意义的。调试器甚至无法计算出正确的变量值(这只是合乎逻辑的)。

所以我很困惑如何处理它。为什么它首先会失败,为什么它要在调试模式下优化程序?

另外,不好笑的是,我们遇到了一个 c++ 编译器错误,编译器没有注意到没有传递模板参数,因此导致一些代码静默失败。

【问题讨论】:

  • 您必须提供比这更多的信息。当代码在不同的优化级别下表现不同时,通常表示某种未定义的行为。也就是说,编译器中的错误并非闻所未闻,但也很少见。
  • 我可能想补充一点,我们不使用类似#ifdef DEBUG 之类的东西。我还可以向您保证,该程序在几个月内运行良好。所以我想知道是什么让 VS 想要选择。被打开,因为这不是一件好事(选择在调试模式下打开)。抱歉,我不确定还能提供什么
  • 抱歉,没有得到未定义的行为提示。我可以说该应用程序太大,无法轻松扫描此类隐藏细节。
  • 如果您不知道“未定义行为”是什么,您可能应该查一下。在大型项目中寻找这样的错误并不是一件容易的事。祝你好运。
  • 我知道,只是没意识到你写了什么。请记住,我想知道为什么 VS 事物优化的代码对调试模式有好处,因为它不会对我们构建的所有库和应用程序所依赖的所有库都要求这样做。

标签: c++ visual-studio-2010 compiler-optimization


【解决方案1】:

项目默认值不是调试模式默认值,实际上是发布模式的默认值。项目默认值不知道调试/发布配置。覆盖 /Od 是调试配置的默认设置。如果您已将调试配置中的所有项目属性重置为默认值,那么您已将调试配置设置为与发布模式几乎相同。

调试/发布配置没有什么特别之处 - 它们只是名称,因此项目属性不包括每个项目的特殊默认值。

【讨论】:

  • 好的,很高兴知道。毕竟,我设法发现激活 /ZI(编辑和恢复)以支持 /Zi 也会使应用程序在使用 /Od 时在调试模式下工作(未打开优化)。我还是一头雾水。这不可能是真的。编辑和恢复不应该影响基本代码,它应该只是添加代码让用户在调试时动态编辑代码。
【解决方案2】:

想想返回值优化之类的东西。还要查找打开代码优化时编译器避免创建的临时对象。也许你可以使用一些C++ lint 应用程序来找出你的代码在调试模式下行为不端的一些原因。

【讨论】:

  • 忘了说,我们已经用过cppcheck了,确实没发现什么问题。我们已经在几个月前使用它了。我将尝试在我们现在依赖的新库上重新运行它。非常感谢。
猜你喜欢
  • 2017-06-21
  • 1970-01-01
  • 2021-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多