如何调试在Release build中优化的变量

How to debug a variable that is optimized away in Release build

本文关键字:build 优化 变量 Release 何调试 调试      更新时间:2023-10-16

我使用的是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中崩溃。查找其他未初始化的变量或堆栈损坏/索引越界访问。