我想在发给客户的发布版本中包含调试信息。据我所知,唯一的缺点就是二进制文件大小增加了25%。好处是我可以获得可立即使用的崩溃转储,容易分析。
我愿意接受25%的增加。我是否漏掉了其他缺点?
这是一个C项目,我只想进行链接/调试/生成调试信息。
我想在发给客户的发布版本中包含调试信息。据我所知,唯一的缺点就是二进制文件大小增加了25%。好处是我可以获得可立即使用的崩溃转储,容易分析。
我愿意接受25%的增加。我是否漏掉了其他缺点?
这是一个C项目,我只想进行链接/调试/生成调试信息。
可执行文件的大小不应该增加超过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文档。如果您要分发符号,则使用该选项可能是合适的。
在我的情况下,启用两者都有帮助。/DEBUG将/OPT选项的默认值从REF更改为NOREF,从ICF更改为NOICF(因此,您需要显式指定/OPT:REF或/OPT:ICF)。
/O2 /DEBUG /OPT:REF /OPT:ICF
你没有提到你使用的编程语言,对于 C++ 和 C# 可能会有不同的答案。
我不确定你考虑要做什么修改。你是要告诉 Visual Studio 制作其标准的 Debug 编译并进行发布,还是要编辑 Release 编译中的一些设置?小心地修改 Release 构建中的一些设置似乎是最好的做法。
无论最终采取什么方法,我都会确保优化已经开启,因为这可以显著提高编译后代码的性能。
我总是发送调试版本,而不是发布版本。我想不到任何缺点,而优点正如你所提到的。