Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio Visual Studio:发布版本中的调试信息_Visual Studio_Debugging_Build_Debug Symbols - Fatal编程技术网

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

Visual studio Visual Studio:发布版本中的调试信息,visual-studio,debugging,build,debug-symbols,Visual Studio,Debugging,Build,Debug Symbols,我很想在发布给客户的版本中包含调试信息。就我所见,唯一的缺点是二进制文件大小增加了25%。优点是我可以得到一个立即可用的崩溃转储,更容易分析。 我愿意接受25%的增长。我还缺少其他缺点吗 这是一个C项目,我只想链接/调试/生成调试信息我总是发送调试版本,而不是发布版本。我想不出有什么缺点,优点是如你所说的。 < P>你没有提到你在用什么语言,而且对于C++和C,可能有不同的答案。 我不是100%确定你在考虑做什么改变。您是要告诉VisualStudio进行标准的调试编译并发布,还是要在发布编译中

我很想在发布给客户的版本中包含调试信息。就我所见,唯一的缺点是二进制文件大小增加了25%。优点是我可以得到一个立即可用的崩溃转储,更容易分析。 我愿意接受25%的增长。我还缺少其他缺点吗


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

我总是发送调试版本,而不是发布版本。我想不出有什么缺点,优点是如你所说的。

< P>你没有提到你在用什么语言,而且对于C++和C,可能有不同的答案。 我不是100%确定你在考虑做什么改变。您是要告诉VisualStudio进行标准的调试编译并发布,还是要在发布编译中编辑一些设置?对发布版本中的几个设置进行仔细修改,我认为这是最好的方法


无论您最终得到什么,我都会确保启用优化,因为这会显著提高编译代码的性能。

可执行文件的大小应增加不到25%

事实上,我有点惊讶它竟然会增加很多,但一些快速测试表明,至少有一个大型示例项目(ScummVM)将.exe从10205184字节增加到10996224字节,只需将
/DEBUG
选项添加到链接步骤(大约增加8%)<代码>/DEBUG是使用IDE中的
“链接器|调试|生成调试信息”
选项指定的。请注意,此设置对编译器生成的优化没有影响

我知道一个指向.pdb文件的指针被放在可执行文件中,但这并不多。我做了一些实验,发现启用
/OPT:REF
链接器选项将大小差异更改为10205184与10205696。因此,非
/DEBUG
构建的大小保持不变,但
/DEBUG
构建的大小仅增加了512字节(这可以通过指向-.pdb的指针来解释-可能链接器将其舍入512的倍数或其他内容)。增幅远低于1%。显然,添加
/DEBUG
会导致链接器保留未引用的对象,除非同时指定
/OPT:REF
。(
“链接器|优化|引用”
IDE中的选项)

该程序在没有.pdb文件的情况下运行良好-如果希望在客户站点提供更好的调试体验,可以选择将其发送给客户。如果您只是希望能够获得适当的堆栈跟踪,则不需要在客户计算机上安装.pdb文件-客户计算机(或您提供的某些工具/功能)可以发送转储文件,该文件可以加载到您站点的调试器中,并且.pdb文件可用,并获得相同的堆栈跟踪信息

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


我能想到的分发.pdb文件的唯一缺点是,如果您担心的话,它可以使应用程序的逆向工程变得更容易。请注意,Microsoft为Windows分发符号(使用公共符号服务器,以及某些特定版本的完整符号集包)。然而,它们分发的符号确实通过一个消毒步骤,去除了他们认为敏感的某些物品。您可以使用链接器的
/PDBSTRIPPED
选项(IDE中的
“链接器|调试|剥离专用符号”
)执行相同(或类似)操作。有关该选项删除的内容的详细信息,请参见。如果要分发符号,则可能适合使用该选项。

根据VisualStudio2005文档,位于:

/DEBUG将/OPT选项的默认值从REF更改为NOREF,并且 从ICF到NOICF(因此,您需要明确指定/OPT:REF或 /选择:ICF)

在我的案例中,当我同时启用以下两个功能时,它会有所帮助:

/O2 /DEBUG /OPT:REF /OPT:ICF

优化是有用的things@SLAks是的,我同意。我不是在做一个调试版本,而是一个带有调试信息的发布版本。。。我的理解是,它仍然有所有的优化,只是一些调试符号也包括在内。嗯,这就是我想澄清的问题。想象一下一个汽车经销商说“我总是卖实验室原型,而不是工厂里的真车”。。。哦,您可能不允许将调试运行时分发给客户(IANAL,但请查看编译器的许可证)。。。我如何确保优化仍在进行中?我的意思是,它们是启用的,但是如果“生成调试信息”覆盖了设置并禁用它们呢?如果您使用的是平面C,则此设置位于项目的属性页中的Configuration Properties::C/C++:::Optimization下。我相信默认设置是调试版本禁用优化(/Od),发布版本最大化速度(/O2)。如果要验证编译器设置是否生效,请选择一个方法,并查看反汇编程序中的调试和修改释放编译器。在调试中,C代码和程序集之间有很强的相关性,在优化的构建中,事情会重新安排,并且更难遵循。理论上,您可以将ModifiedRelease程序集与实际版本程序集进行比较,它应该是相同的,或者至少比调试程序集更接近。显然,SCUMVM几乎没有未引用的代码:)在我启用剥离未引用的符号后,可执行文件的大小恢复正常。非常感谢你!看起来应该指定/OPT:REF来删除未引用的对象,而不是/OPT:NOREF。那完全不是直觉