调试优化版本是否会导致程序的行为不同

Can debugging an optimized build cause a program to behave differently?

本文关键字:程序 版本 优化 是否 调试      更新时间:2023-10-16

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

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

最重要的是,如果我关闭优化,我可以很好地完成它。

我知道我不应该调试优化的代码,但一直认为这是因为编译器做了内联函数、展开或删除冗余循环以及优化局部变量等操作。调试器会降低正在发生的事情的可见性,但它不会破坏任何东西。

这让我担心关闭优化只是隐藏了一个错误。所以我的问题是,我应该期望像调试版本一样逐步完成优化构建,还是应该期望调试器破坏它?

嗯,有两个问题:

  1. 关闭优化会隐藏错误吗?
  2. 使用调试器会破坏事情吗?

有时,这两个问题的答案都是。

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

Dito用于更改程序运行的环境,"在调试器下"是一个完全不同的环境,而不是没有环境。
这尤其会影响竞争条件,使用调试器很难诊断。
参见海森虫。