为啥在发布模式下调试会隐藏信息?
Posted
技术标签:
【中文标题】为啥在发布模式下调试会隐藏信息?【英文标题】:Why is it that debugging in release mode hides information?为什么在发布模式下调试会隐藏信息? 【发布时间】:2013-10-22 12:11:36 【问题描述】:在发布调试时,c++ 代码不会扩展某些变量。哪些变量是不能扩展的,为什么会这样?我可以理解发布的 dll 已经打包了额外的优化,但不太确定这是否是唯一的原因。还有什么办法可以查看这些值
【问题讨论】:
是的,这几乎是唯一的原因。 使用日志记录查看这些变量 在视觉工作室中。我有时会修改 RelWithDebugInfo 配置以在没有任何优化的情况下构建。这样调试就容易多了,而且我有 Release 堆。虽然这只有助于我关闭优化的代码。 附带说明一下,托管代码也会发生这种情况吗? 【参考方案1】:即使假设您在构建中有调试信息,调试发布构建(优化)通常也很困难。优化器可以将代码的结果破坏到您可能无法识别的程度。
它将完全删除变量并隐藏它们从调试器中(因为变量不存在,调试器无法显示它们)。它可能不会删除它,但会暂时重用寄存器溢出的空间,您将看到变量跳转到某个随机值的内存值。流程可能会重新排序,并且变量可能是并且具有正确的值一旦初始化,但初始化可能已被进一步向下推并且尚未执行......
如果您可以在调试版本中重现该问题,我将从那里开始。如果没有,祝你好运。不要相信你看到的任何东西,但尽量从你可用的数据点中提取尽可能多的信息。
【讨论】:
【参考方案2】:当您在“调试”模式下构建时,编译器(和链接器)会添加有关变量、它们的名称、使用的源文件、行号信息等的额外信息。在“发布”中编译时会丢失这些信息模式。 可以通过在项目设置中更改它来添加。
【讨论】:
优化器可能决定不为某些变量分配内存,因此即使存在调试信息,它们也是不可见的以上是关于为啥在发布模式下调试会隐藏信息?的主要内容,如果未能解决你的问题,请参考以下文章