为什么Visual Studio 2005在发布版编译时生成.pdb文件?我不会调试发布版本,那么为什么要生成它们呢?
.pdb
PDB既可以为Release生成,也可以为Debug生成。这是设置在(在VS2010中,但在VS2005中必须相似):
Release
Debug
项目→属性→构建→高级→调试信息
只需将其更改为None。
None
为什么您如此确定您不会调试发布版本?有时(希望很少,但确实会发生),您可能会从客户那里得到一个缺陷报告,由于某些原因(不同的时间,小的不同行为或其他原因),该报告在调试版本中是不可重复的。如果该问题在发布版本中是可重复的,那么您将很高兴拥有匹配的pdb。
因为如果没有PDB文件,就不可能通过地址级调试以外的任何方法来调试“发布”构建。优化确实会对你的代码造成影响,如果出现问题(比如抛出异常),就很难找到罪魁祸首。即使设置断点也是极其困难的,因为源代码行不能与生成的程序集代码一一匹配(甚至不能以相同的顺序匹配)。PDB文件可以帮助您和调试器,使事后调试更加容易。
您指出,如果您的软件已经准备好发布,那么您应该在发布之前完成所有的调试工作。虽然这是正确的,但有几个重要的要点需要记住:
你应该也测试和调试你的应用程序(在你发布它之前)使用“发布”构建。这是因为打开优化(它们在“调试”配置下默认是禁用的)有时会导致您无法捕捉到的微妙错误出现。在进行此调试时,您将需要PDB符号。
客户经常报告只有在“理想”条件下才会突然出现的边缘情况和错误。这些东西几乎不可能在实验室重现,因为它们依赖于用户机器的一些古怪配置。如果他们是特别有用的客户,他们将报告抛出的异常,并为您提供堆栈跟踪。或者他们甚至会让你借他们的机器远程调试你的软件。在这两种情况下,您都需要PDB文件来帮助您。
分析应该总是在“发布”版本上进行,并启用优化。同样,PDB文件也很方便,因为它们允许将被分析的汇编指令映射回您实际编写的源代码。
你不能返回并生成PDB文件后编译。*如果你没有在构建过程中创建它们,你就失去了机会。创造它们不会伤害任何东西。如果您不想分发它们,您可以简单地将它们从二进制文件中删除。但如果你后来决定要它们,那你就不走运了。最好总是生成它们并存档一份副本,以备不时之需。
如果你真的想关掉它们,这总是一个选择。在项目的属性窗口中,将“调试信息”选项设置为“none”,用于您想更改的任何配置。
但是要注意,“Debug”和“Release”配置做默认使用不同的设置来发出调试信息。您将希望保留此设置。对于调试版本,“调试信息”选项被设置为“完整”,这意味着除PDB文件外,调试符号信息还嵌入到程序集中。您还可以获得支持“编辑并继续”等很酷的功能的符号。在发布模式中,选择了“仅PDB”选项,正如它听起来那样,它只包括PDB文件,而不影响程序集的内容。因此,这并不像在你的/bin目录中仅仅存在或不存在PDB文件那么简单。但是假设您使用了“仅使用PDB”选项,PDB文件的存在将不会影响代码的运行时性能。
/bin
*正如Marc Sherman在评论中指出的那样,只要您的源代码没有改变(或者您可以从版本控制系统检索原始代码),您可以重新构建它并生成匹配的PDB文件。至少,通常是这样。这在大多数时候都工作得很好,但是编译器不保证每次编译相同的代码时都生成相同的二进制文件,所以可能有细微的差异。更糟糕的是,如果您在此期间对工具链进行了任何升级(例如为Visual Studio应用服务包),则pdb甚至不太可能匹配。为了保证ex postfacto PDB文件的可靠生成,您不仅需要在版本控制系统中存档源代码,还需要存档整个构建工具链的二进制文件,以确保您可以精确地重新创建构建环境的配置。不用说,简单地创建和归档PDB文件要容易得多。
. pdb文件是“程序数据库”的简称。它包含调试器的调试点信息以及所使用或引用的资源。它是在以调试模式构建时生成的。它允许应用程序在运行时进行调试。
在调试模式下。pdb文件的大小增加。它在我们测试应用程序时使用。
pdb文件的好文章。
http://www.codeproject.com/Articles/37456/How-To-Inspect-the-Content-of-a-Program-Database-P
此外,您还可以利用崩溃转储来调试软件。客户将它发送给您,然后您可以使用它来识别源代码的确切版本——Visual Studio甚至会使用崩溃转储提取正确的调试符号集(如果设置正确,还会提取源代码)。参见微软的符号存储文档。
在多项目解决方案中,您通常希望有一个完全不生成PDB或XML文件的配置。与其将每个项目的Debug Info属性更改为none,我认为添加一个仅在特定配置中工作的构建后事件会更方便。
Debug Info
none
不幸的是,Visual Studio不允许您为不同的配置指定不同的构建后事件。所以我决定手动做这件事,通过编辑启动项目的csproj文件并添加以下内容(而不是任何现有的PostBuildEvent标记):
csproj
PostBuildEvent
<PropertyGroup Condition="'$(Configuration)' == 'Publish'"> <PostBuildEvent> del *.pdb del *.xml </PostBuildEvent> </PropertyGroup>
不幸的是,这将使后构建事件文本框为空白,在其中放入任何内容都可能产生不可预测的结果。
一种可能的方法是:在TFS构建过程的末尾,将它们移动到一个单独的工件。
实际上,如果没有PDB文件和他们拥有的符号信息,就不可能创建一个成功的崩溃报告(内存转储文件),微软也不会完全了解导致问题的原因。
因此,拥有PDB可以改善崩溃报告。