【发布时间】:2012-11-19 10:43:43
【问题描述】:
我们最近遇到了 VS2010 Express C++ 的一个非常奇怪的行为。
我们运行完美的应用程序在调试模式下突然出现意外行为,例如以某种方式呈现到全屏,尽管它是一个很小的编辑器窗口。
我们发现可以通过将调试模式中的代码优化从“停用”(/Od)切换到“项目默认”来禁用新行为,然后意外使用“最大化速度”选项(/氧气)。
如果不是因为代码重构而现在几乎不可能进行调试,那么这还不错,所以断点、单步执行、查看值都是没有意义的。调试器甚至无法计算出正确的变量值(这只是合乎逻辑的)。
所以我很困惑如何处理它。为什么它首先会失败,为什么它要在调试模式下优化程序?
另外,不好笑的是,我们遇到了一个 c++ 编译器错误,编译器没有注意到没有传递模板参数,因此导致一些代码静默失败。
【问题讨论】:
-
您必须提供比这更多的信息。当代码在不同的优化级别下表现不同时,通常表示某种未定义的行为。也就是说,编译器中的错误并非闻所未闻,但也很少见。
-
我可能想补充一点,我们不使用类似#ifdef DEBUG 之类的东西。我还可以向您保证,该程序在几个月内运行良好。所以我想知道是什么让 VS 想要选择。被打开,因为这不是一件好事(选择在调试模式下打开)。抱歉,我不确定还能提供什么
-
抱歉,没有得到未定义的行为提示。我可以说该应用程序太大,无法轻松扫描此类隐藏细节。
-
如果您不知道“未定义行为”是什么,您可能应该查一下。在大型项目中寻找这样的错误并不是一件容易的事。祝你好运。
-
我知道,只是没意识到你写了什么。请记住,我想知道为什么 VS 事物优化的代码对调试模式有好处,因为它不会对我们构建的所有库和应用程序所依赖的所有库都要求这样做。
标签: c++ visual-studio-2010 compiler-optimization