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

Posted

技术标签:

【中文标题】调试优化的构建会导致程序行为不同吗?【英文标题】:Can debugging an optimized build cause a program to behave differently? 【发布时间】:2014-12-03 00:08:21 【问题描述】:

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

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

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

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

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

【问题讨论】:

调试改变了时间,这可以完全改变活泼代码(即UB)的行为。你自然应该调试优化的代码。虽然只有在您确保未优化的构建工作之后,因为它更难进行优化。同样是的,构建选项的任何更改都可能发现或隐藏错误。 【参考方案1】:

嗯,有两个问题:

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

两者的答案都是有时。

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

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

【讨论】:

以上是关于调试优化的构建会导致程序行为不同吗?的主要内容,如果未能解决你的问题,请参考以下文章

在模拟器/设备上/使用或不使用 Chrome 调试时反应本机行为不同

使用 LLVM 构建和任何优化都会导致应用程序在启动时崩溃

混合 STL 调试/发布库

COM Interop 和 .NET 3.5 的问题 - 调试和发布模式下的不同行为

代码运行,但报告我正在发布版本中调试

Xcode 构建和调试奇怪的行为?