发布生成.pdb文件,为什么?
为什么Visual Studio 2005在发行版中编译时生成.pdb
文件? 我不会debugging发布版本,为什么他们生成?
因为没有PDB文件,不可能通过除地址级debugging之外的其他任何东西来debugging“发布”版本。 优化确实会在代码上做一个数字,如果发生错误(例如抛出exception),就很难find罪魁祸首。 即使设置断点也是非常困难的,因为源代码的行不能与生成的汇编代码一一对应(甚至是相同的顺序)。 PDB文件可以帮助您和debugging器,使验尸debugging更加容易。
您指出,如果您的软件已准备好发布,那么您应该已经完成了您的所有debugging。 虽然这确实如此,但要牢记以下几点:
-
您还应该使用“Release”版本testing和debugging您的应用程序(在发布之前)。 这是因为打开优化(在“debugging”configuration下它们被默认禁用)有时会导致出现细微的错误,否则您将无法捕获。 当你正在做这个debugging时,你会想要PDB符号。
-
客户经常报告只在“理想”条件下出现的边缘情况和错误。 这些是在实验室中几乎不可能复制的东西,因为它们依赖于用户机器的一些糟糕的configuration。 如果他们是特别有用的客户,他们会报告抛出的exception并为您提供堆栈跟踪。 或者他们甚至会让你借用他们的机器远程debugging你的软件。 在这两种情况下,您都需要PDB文件来帮助您。
-
应始终在启用优化的“发布”版本上进行性能分析。 再次,PDB文件派上用场,因为它们允许将被汇编的汇编指令映射回您实际编写的源代码。
编译后不能返回并生成PDB文件。 *如果在构build过程中没有创build它们,则失去了机会。 创造它们并不会伤害任何东西。 如果你不想分发它们,你可以简单地从你的二进制文件中删除它们。 但是,如果你以后决定要他们,那你倒霉了。 最好总是生成它们并存档,以防万一你需要它们。
如果你真的想把它关掉,那总是一个select。 在您的项目的“属性”窗口中,将“debugging信息”选项设置为“无”,以进行要更改的任何configuration。
但请注意,“Debug”和“Release”configuration默认使用不同的设置来发出debugging信息。 你会想保持这个设置。 对于Debug版本,“Debug Info”选项设置为“full”,这意味着除了PDB文件,debugging符号信息也被embedded到程序集中。 您还可以获得支持诸如编辑和继续等很酷function的符号。 在发布模式下,select“仅限pdb”选项,就像听起来那样,它只包含PDB文件,而不会影响程序集的内容。 所以它不像在/bin
目录中存在或不存在PDB文件那么简单。 但是,假设您使用“仅限pdb”选项,则PDB文件的存在不会影响代码的运行时性能。
正如Marc Sherman在评论中指出的那样 ,只要你的源代码没有改变(或者你可以从版本控制系统中检索原始代码),你可以重build它并生成一个匹配的PDB文件。 至less,通常。 这在大多数情况下运行良好,但是编译器无法保证每次编译相同的代码时都会生成相同的二进制文件 ,因此可能会有细微差别。 更糟糕的是,如果您在此期间升级了您的工具链(比如为Visual Studio应用Service Pack),则PDB更不可能匹配。 为了确保可靠地生成事后 PDB文件,您不仅需要存档版本控制系统中的源代码,还需要存档整个构build工具链的二进制文件,以确保您可以精确地重新创build构build环境的configuration。 不用说,简单地创build和存档PDB文件就容易多了。
PDB可以为Release
和Debug
进行生成。 这是设置在(在VS2010中,但在VS2005中必须相似):
Project
→Properties
→Build
→Advanced
→Debug Info
只要将其更改为None
。
没有.pdb文件,它实际上是不可能通过生产代码; 你必须依靠其他昂贵而费时的工具。 我知道你可以使用跟踪或windbg例如,但这取决于你想达到什么目的。 在某些情况下,您只需使用生产数据来浏览远程代码(无错误或exception)以观察特定行为,这就是.pdb文件派上用场的地方。 没有他们在代码上运行debugging器是不可能的。
为什么你确定你不会debugging发布版本? 有时候(希望很less,但是发生),你可能会得到一个客户的缺陷报告,由于某种原因(不同的定时,小的不同的行为或者其他),在debugging版本中是不可复制的。 如果这个问题在发布版本中似乎是可重现的,那么您将很高兴拥有匹配的pdb。
此外,您可以利用故障转储来debugging您的软件。 客户将其发送给您,然后您可以使用它来确定源代码的确切版本 – 而Visual Studio甚至会使用故障转储来提取正确的debugging符号集(如果设置正确,则会提供源代码)。 请参阅Microsoft的符号存储文档 。
.PDB文件是“程序数据库”的简称。 它包含debugging器的debugging点信息以及使用或引用的资源。 它是在我们构build为debugging模式时生成的。 它允许应用程序在运行时进行debugging。
在debugging模式下,.PDB文件的大小是增加的。 当我们testing我们的应用程序时使用它。
发布或部署时不需要此文件。 pdb文件的好文章。
http://www.codeproject.com/Articles/37456/How-To-Inspect-the-Content-of-a-Program-Database-P
在多项目解决scheme中,您通常希望拥有一个完全不生成PDB或XML文件的configuration。 我none
把每个项目的Debug Info
属性都改为none
,而是认为添加只能在特定configuration下工作的post-build事件会更加方便。
不幸的是,Visual Studio不允许你为不同的configuration指定不同的构build后事件。 所以我决定通过编辑启动项目的csproj
文件并添加以下内容(而不是任何现有的PostBuildEvent
标记)来手动执行此操作:
<PropertyGroup Condition="'$(Configuration)' == 'Publish'"> <PostBuildEvent> del *.pdb del *.xml </PostBuildEvent> </PropertyGroup>
不幸的是,这将使后构build事件文本框为空,并把任何东西都可能有不可预知的结果。
debugging符号( .pdb)和XML文档( .xml)文件占总大小的很大一部分,不应该是常规部署软件包的一部分。 但是如果需要的话,应该可以访问它们。
一种可能的方法:在TFS构build过程结束时,将它们移动到单独的工件上。