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