调试优化的构建可以导致程序的行为不同吗?

时间:2014-12-03 00:08:22

标签: c++ visual-studio-2010 debugging

我正在为应用程序创建一个插件。由于SDK的怪癖,我只能将我的插件构建为Release版本。

在处理代码的特定部分时,我发现了奇怪的行为。在调试器中单步调试时,我会看到堆损坏和SDKs函数中的访问冲突,但代码似乎没有任何问题。代码在调试器外运行良好。

最重要的是,如果我关闭优化,我可以顺利完成。

我知道我不应该调试优化代码,但总是认为这是因为编译器执行内联函数,展开或删除冗余循环以及优化局部变量等操作。调试器会降低对是什么的可见性,但它不会破坏任何东西。

这让我担心关闭优化只是隐藏了一个错误。所以我的问题是,我是否应该期望像调试版本那样逐步完成优化版本,或者我应该期望调试器能够破解它?

1 个答案:

答案 0 :(得分:1)

嗯,有两个问题:

  1. 关闭优化会隐藏错误吗?
  2. 使用调试器会破坏什么吗?
  3. 有时两者的答案都是。

    对构建选项的任何更改都可能会隐藏,从而暴露出一组不同的错误,并改变它们的表达方式。

    Dito用于更改程序运行的环境,“在调试器下”是一个完全不同的环境,而不是没有。 这尤其会影响使用调试器难以诊断的竞争条件 请参阅heisenbug