Visual Studio:在发布版本中调试信息

32

我想在发给客户的发布版本中包含调试信息。据我所知,唯一的缺点就是二进制文件大小增加了25%。好处是我可以获得可立即使用的崩溃转储,容易分析。

我愿意接受25%的增加。我是否漏掉了其他缺点?

这是一个C项目,我只想进行链接/调试/生成调试信息。

4个回答

43

可执行文件的大小不应该增加超过25%。

实际上,我有点惊讶它会有很多增加,但是一些快速测试显示至少一个大型示例项目(ScummVM)仅通过在链接步骤中添加/DEBUG选项就将.exe文件从10,205,184字节增加到10,996,224字节(约8%的增加)。/DEBUG是使用IDE中的"链接器|调试|生成调试信息"选项指定的。请注意,此设置不应该对编译器生成的优化产生任何影响。

我知道指向.pdb文件的指针放置在可执行文件中,但那没什么用。我进行了一些实验,并发现启用/OPT:REF链接器选项会将大小差异更改为10,205,184与10,205,696之间。因此,非/DEBUG构建保持相同的大小,但/DEBUG构建仅增加了512个字节(可能归咎于指向.pdb文件的指针-也许链接器会舍入到512或其他倍数)。远少于1%的增加。显然,添加/DEBUG会导致链接器保留未引用的对象,除非您还指定了/OPT:REF。(IDE中的"链接器|优化|引用"选项)。

程序将在没有.pdb文件的情况下正常运行-您可以选择向客户发送它,如果您想在客户现场提供更好的调试体验。如果您只想能够获得良好的堆栈跟踪,则不需要在客户机上具有.pdb文件-他们(或您提供的某些工具/功能)可以发送转储文件,该文件可以在带有可用.pdb文件的调试器中加载并获得相同的堆栈跟踪信息。

当然,需要注意的一点是,您需要随发布版本一起存档.pdb文件。 "Windows调试工具"包(现在在Windows SDK中分发)提供了一个符号服务器工具,因此您可以归档.pdb文件并轻松检索它们以进行调试。

我想到唯一的缺点是,如果这是您关心的问题,分发.pdb文件可能会使反向工程您的应用程序变得更加容易。请注意,Microsoft为Windows分发符号(使用公共符号服务器-以及某些特定版本的完整符号集的软件包)。但是,他们分发的符号经过了清理步骤,删除了某些他们认为敏感的项目。您可以使用链接器的/PDBSTRIPPED选项(IDE中的"Linker | Debugging | Strip Private Symbols")执行相同或类似的操作。有关该选项删除内容的详细信息,请参见MSDN文档。如果您要分发符号,则使用该选项可能是合适的。


显然,SCUMVM几乎没有未引用的代码 :) 在我启用剥离未引用符号后,可执行文件大小恢复正常。非常感谢! - MK.
看起来应该使用/OPT:REF来删除未引用的对象,而不是/OPT:NOREF。https://msdn.microsoft.com/en-us/library/bxwfs976.aspx 对我来说这不太直观... - Roman

2
根据Visual Studio 2005文档中的说明(位于Visual Studio 2005已退役文档):

/DEBUG将/OPT选项的默认值从REF更改为NOREF,从ICF更改为NOICF(因此,您需要显式指定/OPT:REF或/OPT:ICF)。

在我的情况下,启用两者都有帮助。
/O2 /DEBUG /OPT:REF /OPT:ICF

1

你没有提到你使用的编程语言,对于 C++ 和 C# 可能会有不同的答案。

我不确定你考虑要做什么修改。你是要告诉 Visual Studio 制作其标准的 Debug 编译并进行发布,还是要编辑 Release 编译中的一些设置?小心地修改 Release 构建中的一些设置似乎是最好的做法。

无论最终采取什么方法,我都会确保优化已经开启,因为这可以显著提高编译后代码的性能。


但另一个问题是...我怎么确保优化仍然存在?我的意思是,它们已经被启用,但是如果“生成调试信息”覆盖设置并禁用它们会怎么样? - MK.
如果您使用的是C语言,该设置位于项目的属性页面中,在“配置属性::C/C++::优化”下。我相信默认值为调试版本禁用优化(/Od),发布版本最大化速度(/O2)。 - David Yaw
如果您想验证编译器设置是否生效,请选择一个方法,并在反汇编器中查看Debug和ModifiedRelease编译。在Debug中,C代码和汇编之间会有很强的相关性,在优化构建中,事情会被重新排列,更难以跟踪。理论上,您可以将ModifiedRelease汇编与真正的Release汇编进行比较,它应该是相同的,或者至少比Debug汇编更接近。 - David Yaw

-7

我总是发送调试版本,而不是发布版本。我想不到任何缺点,而优点正如你所提到的。


5
优化是有用的东西。 - SLaks
2
@SLAks 是的,同意。我不是在制作调试版本,而是在制作带有调试信息的发布版本...我的理解是它仍然具有所有优化,只是包含了一些调试符号。好吧,这就是我想通过这个问题澄清的内容。 - MK.
想象一下汽车经销商说:“我总是出售实验室原型车,而不是工厂生产的真正车辆”......哦,你可能不被允许向客户分发调试运行时(我不是法律专业人士,但请查看编译器的许可证)。 - user948581

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接