如何调试在Release build中优化的变量
How to debug a variable that is optimized away in Release build
我使用的是VS2010。我的调试版本运行良好,但我的发布版本一直崩溃。所以在发布版本模式下,我右键单击项目,选择调试,然后选择启动新实例。在这一点上,我看到一个数组,我已经声明为这样的
int ma[4]= { 1,2,8,4};
永远不会初始化。关于可能发生的事情的任何建议。
在Release中构建时,编译器会对代码执行许多优化。许多优化包括在可能且正确的情况下用硬编码值替换变量
int n = 42;
cout << "The answer is: " << n;
当优化器完成它时,它通常看起来更像:
cout << "The answer is: " << 42;
并且变量CCD_ 1从您的程序中完全消除。如果您正在执行此程序的发布版本,并试图检查n
的值,您可能会看到非常奇怪的值,或者调试器可能会报告n
根本不存在。
还有许多其他优化可以应用,这使得调试优化程序变得相当困难。如果数组被删除,或者数组的初始化被转移到其他地方,那么在数组初始化后放置断点可能会产生非常误导性的信息。
另一个常见的优化是消除未使用的变量,例如:
int a = ma[0];
如果程序中没有实际使用a
的代码,编译器会发现a
是不需要的,并对其进行优化,使其不再存在。
为了查看ma
初始化后的值,最简单可靠的方法是使用所谓的sprintf调试:
cout << "ma values: ";
copy (ma, ma+4, ostream_iterator <int> (cout, ", "));
看看那里到底有什么。
如果调试发布版本,调试器将报告伪值,或者将无法显示大多数变量的任何值。检查变量值是否在Release版本中的最安全方法是使用日志记录。
因此,您的数组很可能在Release中初始化,就像在Debug构建中一样,但您无法通过调试器看到这一点。您似乎还有其他问题导致代码在Release中崩溃。查找其他未初始化的变量或堆栈损坏/索引越界访问。
相关文章:
- 空基优化子对象的地址
- 如何使用ndk-build.cmd构建Android.so文件
- 关闭||运算符优化
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 返回值优化:显式移动还是隐式
- 人脸跟踪arduino代码的优化
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 纯函数,为什么没有优化
- 为什么大多数 pair 实现默认不使用压缩(空基优化)?
- 如何以优化的方式同时迭代两个间距不相等的数组
- CMake "--target install"无需"--build"命令行
- 库标题在标题中不可见,但在 cmake build 下.cpp文件中完全可见.为什么?
- 小字符串优化(调试与发布模式)
- 浮点定向舍入和优化
- Visual Studio 调试优化如何工作?
- Android Studio:如何在build.gradle中定义自定义宏(针对不同的构建变体),并让原生C / C++
- 为什么开关的优化方式与 c/c++ 中的链接不同?
- 线性优化目标函数中的绝对值
- GCC 会优化内联访问器吗?
- 如何调试在Release build中优化的变量