调试优化版本是否会导致程序的行为不同
Can debugging an optimized build cause a program to behave differently?
我正在为一个应用程序开发插件。由于 SDK 的一个怪癖,我只能将我的插件构建为发布版本。
在处理代码的特定部分时,我发现了奇怪的行为。在调试器中单步执行时,我得到似乎是堆损坏的内容,并在 SDK 函数中访问冲突,但代码似乎没有任何问题。代码在调试器外部运行良好。
最重要的是,如果我关闭优化,我可以很好地完成它。
我知道我不应该调试优化的代码,但一直认为这是因为编译器做了内联函数、展开或删除冗余循环以及优化局部变量等操作。调试器会降低正在发生的事情的可见性,但它不会破坏任何东西。
这让我担心关闭优化只是隐藏了一个错误。所以我的问题是,我应该期望像调试版本一样逐步完成优化构建,还是应该期望调试器破坏它?
嗯,有两个问题:
- 关闭优化会隐藏错误吗?
- 使用调试器会破坏事情吗?
有时,这两个问题的答案都是。
对构建选项的任何更改都可能隐藏和暴露一组不同的错误,并改变它们的表达方式。
Dito用于更改程序运行的环境,"在调试器下"是一个完全不同的环境,而不是没有环境。
这尤其会影响竞争条件,使用调试器很难诊断。
参见海森虫。
相关文章:
- 码头化的C++应用程序是否向后兼容早期的内核版本
- 正在解码MSVC 32位版本的程序集(作业).没有手术做什么
- 如何声明一个可以在整个程序中使用的全局 2d 3d 4d .. 数组(堆版本)变量?
- 适用于 WebView2 旧版本的示例应用程序
- 在Visual Studio中单实例Qt应用程序版本5.11.1中,在所有其他窗口的顶部打开Qt MainWindow
- 如何获得CMake Tools以在Visual Studio Code中编译具有C++11(或更高版本)功能的程序?
- 由于____chkstk_darwin,在Catalina上使用部署10.10编译的MacOS应用程序在HighSierra版本<崩溃
- 一个32位版本的应用程序,建立在CentOS 6 x64上,当在较新的Linux上启动时,在"dl_itera
- 如何在运行时对程序创建的.sys文件设置文件版本
- Qt 应用程序中与Qt版本相关的运行时错误
- 如何从二进制文件中获取应用程序的版本号?
- 我如何在 Linux 中获取程序版本
- PHP shell_exec不适用于两个不同的应用程序版本
- 正在从应用程序中获取应用程序版本
- 使用Jenkins、内部版本号和svn修订版管理程序版本
- 在应用程序版本中使用svn修订号
- 程序的守护程序版本崩溃时的查找位置
- 如何使用 c++/QT 在控制面板中更新应用程序版本auto_update
- C++:程序版本
- 我如何从c++获得Windows上的驱动程序版本?