发布生成.pdb文件,为什么?

时间:2011-03-28 09:34:39

标签: .net visual-studio debugging pdb-files debug-symbols

为什么Visual Studio 2005在发布时进行编译会生成.pdb个文件?我不会调试发布版本,为什么它们会生成?

9 个答案:

答案 0 :(得分:390)

因为没有PDB文件,除了地址级调试之外的其他任何东西都不可能调试“Release”构建。优化确实会对你的代码做一个数字,这使得它很难如果出现问题就找到罪魁祸首(例如,抛出异常)。即使设置断点也非常困难,因为源代码行不能与生成的汇编代码一对一匹配(或者甚至以相同的顺序)。 PDB文件可以帮助您和调试器,使得事后调试变得更加容易。

您指出,如果您的软件已准备好发布,那么您应该在那时完成所有调试。虽然这确实是正确的,但要记住几个要点:

  1. 您应该使用“发布”版本测试和调试您的应用程序(在发布之前)。这是因为启用优化(默认情况下,它们在“调试”配置下被禁用)有时会导致出现您无法捕获的细微错误。当您进行此调试时,您将需要PDB符号。

  2. 客户经常报告仅在“理想”条件下出现的边缘情况和错误。这些是在实验室中几乎不可能再现的东西,因为它们依赖于该用户机器的一些破坏性配置。如果他们是特别有用的客户,他们将报告抛出的异常并为您提供堆栈跟踪。或者他们甚至会让你借用他们的机器来远程调试你的软件。在任何一种情况下,您都希望PDB文件能够为您提供帮助。

  3. 在启用优化的“发布”版本中,始终始终进行概要分析。再一次,PDB文件派上用场,因为它们允许将被分析的汇编指令映射回您实际编写的源代码。

  4. 编译之后,你无法返回并生成PDB文件 * 如果你没有在构建过程中创建它们,那么你就失去了机会。创造它们并没有伤害任何东西。如果您不想分发它们,可以从二进制文件中省略它们。但如果你以后决定要他们,那你就不走运了。 最好始终生成它们并归档副本,以防万一你需要它们。

    如果你真的想关掉它们,那总是一个选择。在项目的“属性”窗口中,对于要更改的任何配置,将“调试信息”选项设置为“无”。

    但请注意,“调试”和“发布”配置 默认情况下使用不同的设置来发出调试信息。您需要保留此设置。对于Debug构建,“Debug Info”选项设置为“full”,这意味着除了PDB文件之外,调试符号信息也嵌入到程序集中。您还可以获得支持编辑和继续等酷炫功能的符号。在发布模式下,选择“仅pdb”选项,它听起来只包含PDB文件,而不会影响程序集的内容。因此,它并不像/bin目录中仅存在或不存在PDB文件那么简单。但假设您使用“仅pdb”选项,PDB文件的存在绝不会影响代码的运行时性能。

    * 作为Marc Sherman points out in a comment,只要您的源代码没有更改(或者您可以从版本控制系统中检索原始代码),您就可以重建它并生成匹配的PDB文件。至少,通常。这在大多数情况下运行良好,但是the compiler is not guaranteed to generate identical binaries each time you compile the same code,因此可能是微妙的差异。更糟糕的是,如果您在此期间对工具链进行了任何升级(例如应用Visual Studio的Service Pack),则PDB更不可能匹配。为了保证可靠地生成 ex postfacto PDB文件,您不仅需要存档版本控制系统中的源代码,还需要存档整个构建工具链的二进制文件,以确保您可以精确地存档重新创建构建环境的配置。毫无疑问,简单地创建和存档PDB文件要容易得多。

答案 1 :(得分:80)

可以为Release以及Debug生成PDB。设置为(在VS2010中但在VS2005中必须类似):

  

项目→属性→构建→高级→调试信息

只需将其更改为None

答案 2 :(得分:8)

没有.pdb文件,逐步完成生产代码几乎是不可能的;你必须依赖其他昂贵且耗时的工具。 我知道你可以使用跟踪或windbg,但这实际上取决于你想要实现的目标。 在某些情况下,您只需要使用生产数据单步执行远程代码(没有错误或异常)来观察特定行为,这就是.pdb文件派上用场的地方。没有它们就不能在该代码上运行调试器。

答案 3 :(得分:7)

为什么您确定不会调试发布版本?有时(希望很少但很少发生)您可能会收到客户的缺陷报告,由于某种原因(不同的时间,小的不同行为或其他)在调试版本中无法重现。如果该问题在发布版本中似乎是可重现的,那么您将很乐意拥有匹配的pdb。

答案 4 :(得分:4)

此外,您可以利用故障转储来调试软件。客户将其发送给您,然后您可以使用它来识别源的确切版本 - 并且Visual Studio甚至可以使用故障转储来提取正确的调试符号集(如果设置正确,则会提供源代码)。请参阅Microsoft的documentation on Symbol Stores

答案 5 :(得分:2)

.PDB文件是"程序数据库"的简称。它包含有关调试器的调试点和使用或引用的资源的信息。它是在我们构建为调试模式时生成的。它允许应用程序在运行时进行调试。

调试模式下.PDB文件的大小增加。它在我们测试我们的应用程序时使用。

pdb文件的好文章。

http://www.codeproject.com/Articles/37456/How-To-Inspect-the-Content-of-a-Program-Database-P

答案 6 :(得分:1)

在多项目解决方案中,您通常希望拥有一个根本不生成PDB或XML文件的配置。我没有将每个项目的Debug Info属性更改为none,而是认为添加仅适用于特定配置的后期构建事件更为便利。

不幸的是,Visual Studio不允许您为不同的配置指定不同的构建后事件。所以我决定手动执行此操作,方法是编辑启动项目的csproj文件并添加以下内容(而不是任何现有的PostBuildEvent标记):

  <PropertyGroup Condition="'$(Configuration)' == 'Publish'">
    <PostBuildEvent>
        del *.pdb
        del *.xml
    </PostBuildEvent>
  </PropertyGroup>

不幸的是,这会使post build事件文本框变为空白,并且将任何内容放入其中会产生不可预测的结果。

答案 7 :(得分:0)

调试符号( .pdb)和XML doc( .xml)文件占总大小的很大一部分,不应成为常规部署包的一部分。 但是应该可以在需要的时候访问它们。

一种可能的方法:在TFS构建过程结束时,将它们移动到单独的工件中。

答案 8 :(得分:-1)

实际上,如果没有PDB文件和符号信息,他们将不可能创建成功的崩溃报告(内存转储文件),并且Microsoft不会完全了解导致问题的原因。

因此拥有PDB可以改善崩溃报告。