Visual C++ 2008 'Release' 版本包含调试信息
Posted
技术标签:
【中文标题】Visual C++ 2008 \'Release\' 版本包含调试信息【英文标题】:Visual C++ 2008 'Release' build contains debug informationVisual C++ 2008 'Release' 版本包含调试信息 【发布时间】:2008-10-20 12:20:13 【问题描述】:我注意到在使用 MS Visual Studio 2008 生成新的 C++ 项目时,Release 构建包含调试符号 - 特别是启用了以下设置:
C++/常规/调试信息格式设置为程序数据库。 链接器/调试/生成调试信息设置设置为是。我从未在 Visual Studio 的早期版本中注意到这一点。
那么,除了生成更大的 EXE 文件之外,启用这些设置还有什么缺点吗?
【问题讨论】:
请澄清您是否真的有更大的 EXE 文件,或者(如果像 Dave Van den Eynde 建议的那样)所有额外信息都将进入 PDB 文件。 VC10 也是如此... 【参考方案1】:多年来,我们一直在商业版本中启用这些设置,没有明显的缺点。不过,好处是巨大的。
我们集成了一个故障转储打包程序,它将转储连同其他一些信息一起打包,并通过电子邮件(在用户同意的情况下)发送到公司收件箱。这帮助我们找到了会导致我们永远重现并发现其他问题的问题。
虽然有点离题,但这里有一个链接指向某人所做的出色贡献,它为您提供了一种将崩溃报告器包含到 C++/Windows 应用程序的简单方法: http://www.codeproject.com/KB/debug/crash_report.aspx
注意:不过,最好不要在您的发行版中包含 PDB 文件。也就是说,您必须保留与您发布的版本相匹配的 PDB 文件,以便将来可以正确调试问题。如果使用的 PDB 文件不是使用构建 exe 的相同代码构建的,那么您在尝试调试 dmp 时看到的堆栈将是错误的。
【讨论】:
几年后在一个类似的问题上,以下答案提供了更多细节:***.com/a/6364789/2937955(请参阅有关逆向工程和 /PDBSTRIPPED 选项的有趣说明)【参考方案2】:默认情况下它们是打开的,因为:
-
如果您现在不创建它们,以后将无法创建它们。
您需要它们。
在 Visual C++ 中启用调试信息会导致向二进制标头添加一个小条目,以标识此二进制文件的 PDB。它太小了,没有任何大小问题,并且不包含任何您可能担心分享的有用秘密。
(标题条目标记为 RSDS:谁能猜到原因?)
当然,这些 PDB 将在您的构建机器/备份中使用更多磁盘空间。处理它。当需要调试某些东西时,您需要这些 PDB。
【讨论】:
【参考方案3】:好吧,您可能会提供此调试信息,并且有人可能会使用它来反汇编您的代码。对于一些害怕的人来说,仅此一点可能就是不离开这种方式的理由。
就个人而言,我认为有时为发布版本提供调试信息会很有帮助 - 这样就更容易分析崩溃转储,Watson 博士将在应用程序崩溃时将其存储。 通过这种方式,我确实发现了一些非常晦涩的错误。
【讨论】:
【参考方案4】:启用这些选项并不一定会使您的可执行文件更大。调试信息存储在单独的文件中,扩展名为 PDB。提供调试信息绝不是一个坏主意,除非您真的非常缺乏可用存储空间。
也许这就是它们默认开启的原因:它们不会损害您的可执行文件。发布版本确实使用了诸如函数内联和生成优化代码之类的优化,这使得单步执行变得更加困难,而调试版本则关闭了这些选项。
这里没有缺点。
戴夫
【讨论】:
【参考方案5】:除了 PDB 之外,添加 /Zi 开关确实会生成更大的 .exe 文件。但是,您可以单独链接 /OPT:REF 以将 .exe 文件的大小保持在最低限度。
【讨论】:
在 Visual Studio 2008 中,此设置位于“属性->链接器->优化->参考”下。您也可以考虑启用“启用 COMDAT 折叠”,这也将减少二进制文件的大小。【参考方案6】:由于对 .pdb 文件的引用(即额外的路径),.exe 会稍大一些。就是这样。
【讨论】:
以上是关于Visual C++ 2008 'Release' 版本包含调试信息的主要内容,如果未能解决你的问题,请参考以下文章
在 Visual Studio 2008 中将应用程序构建为发行版时出现问题 - C++
从 Visual C++ 6 迁移到 Visual C++ 2008 express
将 C++ 项目从 Visual Studio 2008 转换为 Visual Studio 2010
我可以在 Visual Studio 2008 中使用 Visual Studio 6 编译的 C++ 静态库吗?