Visual Studio C++ 如何在发布模式下使 debuginfo 可靠

Posted

技术标签:

【中文标题】Visual Studio C++ 如何在发布模式下使 debuginfo 可靠【英文标题】:VisualStudio C++ how to make debuginfo reliable in releasemode 【发布时间】:2009-12-15 12:22:11 【问题描述】:

我有一个小问题。我的应用程序在调试模式下运行没有问题,但在发布模式下崩溃。我无法找到问题所在,因为在发布模式下,所有的 Debuginfo 似乎都是无稽之谈。但是 - 有时在其他项目中,调试输出在发布模式下也有效。我必须更改哪些项目设置才能使调试输出在发布时有效?

谢谢!

【问题讨论】:

【参考方案1】:

即使在发布模式下,“生成调试信息”也应默认设置为“是”。问题是,当您在发布模式下运行时,编译器会优化代码,这使得调试器很难显示正确的变量值(例如,它可能选择将一些变量保留在寄存器中等)。

对此没有什么可做的,您始终可以使用#pragma optimize ("", off) / #pragma optimize ("", on) 关闭全局或围绕特定功能的优化,但这基本上意味着您再次在调试模式下运行并且崩溃可能会消失...

如果您习惯于阅读汇编代码,则可以切换到反汇编模式,并通过一些调查找到变量的正确值。

【讨论】:

嗯,这里的一切都是正确的。但是,我看不出关闭优化如何帮助解决崩溃的真正原因? @Gregory 不,你是对的,它可能不会帮助你找到崩溃。这只是一个如何使显示的变量可靠的示例,但正如我所写的那样,崩溃可能会消失。 崩溃可能会消失,而不是它的原因:)【参考方案2】:

很可能,您正在使用未初始化的变量。

在您的项目设置中,设置

Configuration Properties > C/C++ > General > Debug Information Format

Program Database

然后,设置

Configuration Properties > Linker > Debugging > Generate Debug Info

Yes

古老的“使用跟踪调试”方法可以帮助您大致了解问题出在哪里。然后再次阅读这部分代码并追踪未初始化的变量。

【讨论】:

您好,谢谢!这些设置已经设置。我还设置了 /ASSEMBLYDEBUG - 但调试输出仍然无效 尝试重建您的项目以确保 pdb 同步? 我当然做到了——但还是一样。我可以跟踪传递的函数属性,但是对于所有局部变量,我得到 CXX017 Symbol "variablename" not found @Mat 这是因为在发布模式下 VC 选择将其保存在寄存器中,请参阅我的答案。

以上是关于Visual Studio C++ 如何在发布模式下使 debuginfo 可靠的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio c++ 仅在调试模式下 LNK 1104 错误

如何在 Visual Studio 2015(用于 C++)中仅禁用 SIMD 自动矢量化优化?

在 Visual Studio (C++) 中设置断点问题

可以从命令行运行 C++ 代码,但不能从 Visual Studio 中的调试模式运行

Visual Studio 在调试模式下禁用 TRACE

如何在调试模式下在 MS Visual Studio 中显示零件表达式的值?