C#发布版本仍然有.pdb文件。

68

我想部署用C#编写的应用程序的发布版本。

当我使用Release配置进行构建时,我仍然可以看到产生了.pdb文件,这意味着我的应用程序仍然可以进行调试。这也意味着某些调试信息存在于我的代码中,会稍微减慢它的速度。

如果这是真的,那么我该如何完全禁止在二进制文件中产生任何调试信息?您是否也知道为什么会有发布版.pdb文件?Release配置已经选中了Optimize code,并且只定义了TRACE常量,而没有定义DEBUG常量。

感谢您的协助。


1
@meagar,即使您不希望将它们打包到最终的安装程序MSI中发送给客户,也应该保留.pdb文件以备将来参考。当某些未处理的事情导致您的应用程序在生产环境中崩溃时,pdb文件将是您唯一的希望之光。使用随Windows SDK提供的winDbg工具调试崩溃转储文件时,pdb文件非常有用。优化代码标志应保持选中,正如您所正确提到的那样。 - RBT
6
@RasikBihariTiwari 我不在意,我没有问这个问题。 - user229044
抱歉@meagar!我应该直接与Abruzzo Forte联系。对于造成的不便,我深感抱歉。那时是早上6点,看起来我还在瞌睡中;) - RBT
7个回答

111
如果您想禁用pdb文件生成,需要在单击位于Build选项卡底部的"Advanced..."按钮后,在项目属性中使用可用的"高级构建设置"对话框。
Output - Debug info:设置为None以进行发布版本配置,并且不会生成pdb文件。

1
您还可以使用 MSBuild.exe YourProject.csproj /p:DebugSymbols=false /p:DebugType=None - cowlinator

52

默认情况下,会生成发布版本的 PDB 文件。这是一个功能,你不应该禁用它。生成 PDB 文件意味着你在调试时可以获得更多信息。PDB 文件的存在不会以任何方式影响代码的性能。


嗨,布莱恩!谢谢!我对此持怀疑态度,但似乎每个人都同意这一点! - Abruzzo Forte e Gentile
大家都同意PDB文件不会降低性能吗?有人进行过任何测试来确认吗? - theJerm
1
@theJerm 应用程序在运行时不会读取 PDB 文件。因此,除了它们占用的磁盘空间外,除非您正在调试,否则没有额外开销。 - Brian Rasmussen
1
@BrianRasmussen:PDB文件在逆向工程中有用吗?我正在混淆我的发布版本。我是否仍应该在输出中生成PDB文件? - dotNET
2
抱歉,但我不同意,发布版本应该是纯粹的发布版本,没有调试和运行时依赖。 - Jamie Nicholl-Shelley
除非你要发布商业软件,否则请勿公开。;-) - Jakub Míšek

20
你不需要在发布部署时附带 .PDBs 文件,但保留它们很有用 - 例如,使用本地的 PDBs 来远程调试在不同机器上运行的代码,以获取异常发生位置的行号。如果没有使用 .PDBs,则堆栈跟踪中将不包含行号和文件名,这会使调试变得更加困难。

谢谢!这个很有用!我没意识到每个异常对象的堆栈跟踪中没有行号! - Abruzzo Forte e Gentile

14

在项目属性下的“构建” -> “高级选项...” -> “调试信息:”中,您可以控制pdb /符号生成。可选项如下:

  • none(没有符号信息)
  • full(将生成.pdb,并将一些符号信息嵌入程序集)
  • pdb-only(将生成.pdb,但不影响程序集)

有关更多信息,请参见http://msdn.microsoft.com/en-us/library/8cw0bt21%28VS.80%29.aspx

强烈推荐您选择pdb-only选项,而不是none选项,因为它仍会提供一些符号信息,而不影响程序集——在发布版本上您可能已经选择了此设置。


7
让编译器生成.pdb文件并不排斥对代码进行优化。
要了解更多信息,请阅读这些博客文章

是的,但是根据微软的说法,在汇编中嵌入调试信息也会对性能产生影响。 - Justin

2
编译后的EXE文件包含PDB文件的路径。该路径可能很容易地包含您的姓名并提示您的文件结构。我不喜欢分享这些私人信息!
为了在不丢失调试信息的情况下从EXE文件中删除PDB文件的路径,您可以将PDB文件嵌入到EXE文件中。
属性 => 构建 => 高级(构建设置)=> Debuginfo => 嵌入式。

1
在有许多项目的解决方案中,逐个到各个不同的项目设置中禁用/启用pdb文件生成可能会很繁琐。
或者,可以使用del /S *.pdb命令从主项目的后期构建命令或批处理文件中删除它们,这样您就可以选择是否运行它而无需编辑所有项目文件。
后期构建事件示例:
if $(ConfigurationName) == Release del /S $(TargetDir)*.pdb

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