294

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

4

9 回答 9

454

因为没有 PDB 文件,就不可能通过地址级调试以外的任何方式来调试“发布”版本。优化确实会对您的代码产生影响,如果出现问题(例如,抛出异常),很难找到罪魁祸首。即使设置断点也非常困难,因为源代码行无法与生成的汇编代码一对一匹配(甚至与生成的汇编代码的顺序相同)。PDB 文件可以帮助您和调试器,使事后调试变得更加容易。

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

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

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

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

编译后您无法返回并生成 PDB 文件。*如果你没有在构建过程中创建它们,你就失去了机会。创建它们并没有什么坏处。如果你不想分发它们,你可以简单地从你的二进制文件中省略它们。但是,如果您后来决定要它们,那您就不走运了。最好始终生成它们并存档副本,以防万一您需要它们。

如果您真的想关闭它们,那始终是一种选择。在项目的“属性”窗口中,将要更改的任何配置的“调试信息”选项设置为“无”。

但是请注意,“Debug”和“Release”配置默认使用不同的设置来发出调试信息您将希望保留此设置。Debug 版本的“Debug Info”选项设置为“full”,这意味着除了 PDB 文件之外,调试符号信息也嵌入到程序集中。您还可以获得支持编辑并继续等酷炫功能的符号。在 Release 模式下,选择了“pdb-only”选项,就像听起来一样,它只包含 PDB 文件,而不影响程序集的内容。因此,它并不像目录中是否存在 PDB 文件那么简单/bin。但假设您使用“pdb-only”选项,PDB 文件'

*正如Marc Sherman 在评论中指出的那样,只要您的源代码没有更改(或者您可以从版本控制系统中检索原始代码),您就可以重建它并生成匹配的 PDB 文件。至少,通常情况下。这在大多数情况下运行良好,但不能保证每次编译相同代码时编译器都会生成相同的二进制文件,因此可能存在细微差别。更糟糕的是,如果您同时对工具链进行了任何升级(例如为 Visual Studio 应用服务包),则 PDB 匹配的可能性更小。保证事后的可靠生成PDB 文件,您不仅需要存档版本控制系统中的源代码,还需要存档整个构建工具链的二进制文件,以确保您可以精确地重新创建构建环境的配置。不用说,简单地创建和归档 PDB 文件要容易得多。

于 2011-03-28T09:48:10.633 回答
98

可以生成 PDBRelease以及Debug. 设置为(在 VS2010 中,但在 VS2005 中必须类似):

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

只需将其更改为None.

于 2011-03-28T09:37:57.417 回答
8

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

于 2012-11-29T11:18:55.927 回答
7

为什么你这么肯定你不会调试发布版本?有时(希望很少,但会发生)您可能会从客户那里得到一份缺陷报告,由于某种原因(不同的时间、小的不同行为或其他原因)在调试版本中不可重现。如果该问题在发布版本中似乎可以重现,您将很高兴拥有匹配的 pdb。

于 2011-03-28T09:41:37.150 回答
4

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

于 2015-01-19T23:01:15.203 回答
2

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

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

pdb 文件的好文章。

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

于 2014-05-23T05:34:05.823 回答
1

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

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

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

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

于 2015-12-29T21:36:48.520 回答
0

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

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

于 2017-11-07T13:11:23.280 回答
-1

实际上,如果没有他们拥有的 PDB 文件和符号信息,就不可能创建成功的崩溃报告(内存转储文件),而且 Microsoft 也不会有导致问题的完整图片。

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

于 2019-05-08T20:45:56.420 回答