2011-06-15 50 views
25

我很想将调试信息包含在发布给客户的发布版本中。据我所见,唯一不利的方面是二进制文件大小增加25%。优点是我可以立即获得可用的故障转储,更容易分析。 我愿意接受25%的增长。我还有其他缺点吗?Visual Studio:在发布版本中调试信息

这是一个C项目和所有我想要做的就是链接/调试/生成调试信息

回答

35

可执行文件的大小应该增加远远少于25%。

我其实有点惊讶,它增加了很多,但一些快速测试表明,至少有一个大型示例项目(ScummVM)将.exe从10,205,184字节增加到10,996,224字节,只需将/DEBUG选项添加到链接步骤(大约增加8%)。 /DEBUG是使用IDE中的"Linker | Debugging | Generate Debug Info"选项指定的。请注意,此设置应该对编译器生成的优化没有影响。

我知道指向.pdb文件的指针放在可执行文件中,但没有太多。我尝试了一下,发现启用/OPT:NOREF链接器选项将大小差异更改为10,205,184与10,205,696。所以非/DEBUG构建保持相同的大小,但/DEBUG构建下降到只有512个字节更大(这可以由指针指向.pdb - 可能链接器轮到512的几倍)。远远低于1%的增长。显然,加入/DEBUG会导致链接器保留未引用的对象,除非您还指定/OPT:NOREF。 (IDE中的"Linker | Optimization | References"选项)。

程序运行正常,没有.pdb文件 - 如果您想在客户站点提供更好的调试体验,您可以选择将其发送给客户。如果您只想获得体面的堆栈跟踪,则不需要在客户机器上具有.pdb文件 - 它们(或您提供的某些工具/功能)可以发送转储文件,该文件可以加载到调试器在您的站点提供.pdb文件并获取相同的堆栈跟踪信息port-mortem。

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

我可以考虑分发.pdb文件的唯一缺点是它可以使您的应用程序更容易逆向工程,如果这是您的担忧。请注意,Microsoft为Windows分发符号(使用公共符号服务器 - 以及某些特定版本的完整符号集的包)。但是,他们分发的符号会通过消毒步骤进行,消除他们认为敏感的某些项目。您可以使用链接器的/PDBSTRIPPED选项(IDE中的"Linker | Debugging | Strip Private Symbols")执行相同的操作(或类似操作)。有关选项删除的详细信息,请参阅the MSDN docs。如果您要分发符号,则可能适合使用该选项。

+0

显然,SCUMVM有很少的未引用代码:)在启用剥离未引用符号后,可执行文件大小恢复正常。非常感谢你! – 2011-06-16 01:15:43

+0

感谢您指出链接器参考 – Gob00st 2012-12-15 17:08:01

-7

我总是发出调试版本,从未发布版本。我想不出有什么不利之处,其优点就像你提到的那样。

+4

优化是有益的事情 – SLaks 2011-06-15 20:40:25

+2

@SLAks是啊,同意。我没有进行调试构建,而是使用调试信息进行版本构建......我的理解是,它仍然具有所有优化,只包括一些调试符号。那么,这就是我想要解决这个问题。 – 2011-06-15 20:41:42

+0

想象一下,一个汽车经销商说:“我总是卖实验室原型,而不是真正的汽车从厂里出来”......哦,你可能不允许向客户分发调试运行时间(IANAL,但看看许可证你的编译器)。 – Tibo 2013-09-09 08:27:13

1

你没有提到你在用什么语言,C++和C#可能有不同的答案。

我不是100%确定你正在考虑做什么改变。你打算告诉Visual Studio进行标准的Debug编译,并发布它,还是要在Release编辑中编辑几个设置?在发布版本中仔细修改一些设置可以让我成为最好的方法。无论结果如何,我都会确保开启优化功能,因为这可以使编译代码的性能发生显着变化。

+0

我已经用请求的说明更新了这个问题。 – 2011-06-15 21:06:45

+0

但其他问题是...我如何确保优化仍在?我的意思是,它们已启用,但如果“生成调试信息”会覆盖设置并禁用它们,该怎么办? – 2011-06-15 21:07:42

+0

如果您使用的是C单元,则此设置位于Configuration Properties :: C/C++ :: Optimization下的项目的Property Pages中。我相信这些默认值是针对调试版本的优化禁用(/ Od),以及用于版本构建的最大化速度(/ O2)。 – 2011-06-15 21:15:28

相关问题