PDB文件是什么?

334

PDB文件是程序调试数据库的缩写,其中包含了编译器生成的符号信息和源代码行号等。在重新构建解决方案时,您可以通过配置项目属性来排除PDB文件,以便它们不会出现在发布文件夹中。


26
pdb是程序数据库文件,它在编译时创建。该文件保存了调试和项目状态信息,允许增量链接您的程序的调试配置。 - pavanred
1
@pavanred 你确定C#编译器也支持增量链接吗?我只听说过在C++领域中有这个功能。在C++项目中,你可以从项目属性中启用/禁用增量链接。那么在C#项目中是否也有这个选项呢? - RBT
5个回答

309
一个PDB文件包含了调试器所需的信息。在Release版本中,相比Debug版本,包含的信息较少。但是如果你希望根本不生成此类文件,请前往项目的“构建属性”,选择Release配置,点击“高级...”,并在“调试信息”下选择“无”。

4
如果应用程序在使用过程中崩溃,提供额外信息给用户是否有帮助?(例如,对JIT窗口是否有帮助,而不是“该程序需要结束,请发送Windows错误报告”) - Jared Harley
28
记住要在调试版本中保留这些内容,因为它可以让异常跟踪到代码的具体行。如果pdb文件中没有符号,你将很难找出特定问题并解决它们。你也不一定需要在发布版本中排除它们,因为有时候大型报告中的额外信息非常有用。 - Darbio
4
@Jared:是的,它包含了异常的堆栈跟踪信息,可以精确定位到具体的函数和代码行。 - Darbio
1
@Jared:你所说的“JIT窗口”是什么意思?它不太可能为用户提供更多信息,但如果需要,它可以让你附加调试器到发布版本中。通常情况下,你不会在最终用户应用程序中包含它。当然,仅仅因为它被复制到发布文件夹中并不意味着你必须在安装程序中包含它... - Jon Skeet
3
请将PDB和PDF在您的思维中分开,它们是完全不同的文件格式,用于不同的目的。包含PDB不会特别引入问题;它可能会使黑客的工作稍微容易一些,但这是否是您特别关注的问题呢?通常情况下,在大多数情况下,.NET可以相对容易地反编译-如果您担心这个问题,仅仅不发布PDB并不是一个好的解决方案。 - Jon Skeet
显示剩余5条评论

194

我原本问了自己这个问题:“我需要将PDB文件部署到客户机上吗?”,在阅读了这篇文章后,决定排除该文件。

一切都运行得很顺利,直到今天,当我试图弄清楚为什么一个包含Exception.StackTrace的消息框中缺少文件和行号信息时 - 这些信息是解决异常必要的。我重新阅读了这篇文章并找到了关键信息:虽然PDB对于应用程序的运行不是必需的,但对于StackTrace字符串中存在文件和行号则是必需的。我将PDB文件包含在可执行文件夹中,现在一切都很好。


16
这是一个非常重要的要点,需要记在心里,这里的“被接受的答案”没有提及。 - Monku

124

PDB是“Program-Debug Data Base”的缩写。正如其名,它是一个存储库(例如数据库的持久存储),用于维护运行调试模式下程序所需的信息。它包含了一些重要的代码调试所需的信息,例如在何处放置断点以及您期望Visual Studio (VS)中的调试器中断的地方。

这就是为什么如果从调试目录中删除PDB文件,Visual Studio调试器无法命中断点的原因。Visual Studio调试器能够告诉您代码文件中的确切行号以及其堆栈跟踪,它只能借助PDB文件来实现。因此,PDB文件对于调试非常有帮助。

通常情况下,不建议在构建过程中排除PDB文件的生成。从生产发布的角度来看,您应该创建PDB文件,但不要在产品安装程序中将它们发送到客户站点。将所有生成的PDB文件保留在符号服务器上,以便在将来需要时可以使用/引用。

这在调试进程崩溃问题的情况下特别重要。在分析崩溃转储文件时,如果没有保留构建过程中创建的原始PDB文件,则Visual Studio将无法确定程序崩溃的确切代码行。

如果您仍然想禁用PDB文件的生成,请按以下步骤操作:

  1. 转到项目的属性窗口。要打开属性窗口,请在解决方案资源管理器中选择项目文件,然后按 Alt + Enter 。
  2. 转到生成选项卡
  3. 单击高级
  4. 调试信息下拉框中选择
  5. 按照下面快照中的方式,按 OK

为 C# 项目设置无 None 调试信息

注意:此设置必须分别针对Debug Release构建配置执行。


1
你好。经过9年后,我来这里澄清事实。我发明了PDB文件,并在MS C/C++7.0、VC++ 1.0、2.0和4.0中实施和拥有它们。这里的PDB代表程序数据库。就是这样。事实上,一些无知的Windows shell团队的开发人员认为程序调试数据库或其他什么是个好主意,并不能改变PDB是程序数据库文件的事实。 祝您有愉快的一天。 - undefined

19

PDB文件包含调试器使用的信息。它不是运行应用程序所必需的,也不需要包含在发布的版本中。

你可以在Visual Studio中禁用创建pdb文件。如果你正在从命令行或脚本构建,则省略/Debug开关。


3
Release 模式默认仍会生成 PDB 文件。但是可以更改项目属性来禁用它。 - Jon Skeet
是的,它仍然与默认项目一起发布。 - Andrew Barber
我刚刚检查了一下,如果使用Visual Studio,默认情况下也会得到一个。 - Mark Byers
惊喜!在过去的11年中,那个PDB链接已经失效了。这是新链接:https://www.wintellect.com/pdb-files-what-every-developer-must-know/ - Jesse Chisholm

9

程序调试数据库文件(pdb)是微软用于存储调试信息的一种文件格式。

当您使用Visual Studio或命令提示符构建项目时,编译器会创建这些符号文件。

请查看Microsoft文档


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接