为啥在发布模式下调试会隐藏信息?

Posted

技术标签:

【中文标题】为啥在发布模式下调试会隐藏信息?【英文标题】:Why is it that debugging in release mode hides information?为什么在发布模式下调试会隐藏信息? 【发布时间】:2013-10-22 12:11:36 【问题描述】:

在发布调试时,c++ 代码不会扩展某些变量。哪些变量是不能扩展的,为什么会这样?我可以理解发布的 dll 已经打包了额外的优化,但不太确定这是否是唯一的原因。还有什么办法可以查看这些值

【问题讨论】:

是的,这几乎是唯一的原因。 使用日志记录查看这些变量 在视觉工作室中。我有时会修改 RelWithDebugInfo 配置以在没有任何优化的情况下构建。这样调试就容易多了,而且我有 Release 堆。虽然这只有助于我关闭优化的代码。 附带说明一下,托管代码也会发生这种情况吗? 【参考方案1】:

即使假设您在构建中有调试信息,调试发布构建(优化)通常也很困难。优化器可以将代码的结果破坏到您可能无法识别的程度。

它将完全删除变量并隐藏它们从调试器中(因为变量不存在,调试器无法显示它们)。它可能不会删除它,但会暂时重用寄存器溢出的空间,您将看到变量跳转到某个随机值的内存值。流程可能会重新排序,并且变量可能是并且具有正确的值一旦初始化,但初始化可能已被进一步向下推并且尚未执行......

如果您可以在调试版本中重现该问题,我将从那里开始。如果没有,祝你好运。不要相信你看到的任何东西,但尽量从你可用的数据点中提取尽可能多的信息。

【讨论】:

【参考方案2】:

当您在“调试”模式下构建时,编译器(和链接器)会添加有关变量、它们的名称、使用的源文件、行号信息等的额外信息。在“发布”中编译时会丢失这些信息模式。 可以通过在项目设置中更改它来添加。

【讨论】:

优化器可能决定不为某些变量分配内存,因此即使存在调试信息,它们也是不可见的

以上是关于为啥在发布模式下调试会隐藏信息?的主要内容,如果未能解决你的问题,请参考以下文章

为啥要避免 WPF MVVM 模式中的代码隐藏?

为啥在调试模式下启动 GWT 时,我的断点不会中断

在 iPad 缩放模式下隐藏状态栏会向下推窗口

为啥返回带有方法的指针会使测试在调试模式下失败?

在全屏模式下隐藏标题?

为啥在调试模式和运行模式下保留计数不同?