Portable PDB简介
.NET引入了一种新的符号文件(PDB)格式——Portable PDB。与仅限Windows的传统PDB不同,Portable PDB可以在所有平台上创建和读取。
对于任何不熟悉PDB文件的人来说,PDB文件是由编译器生成的辅助文件,用于提供其他工具,尤其是调试器,有关可执行文件中的内容以及如何生成的信息。Windows PDB格式已经存在了很长一段时间(约25年),它是从其他更古老的本机调试符号格式演变而来的。它最初是作为原生(C/C++)程序的一种格式出现的。第一次发布的.NET框架,Windows PDB格式被扩展以支持.NET。
虽然Windows PDB格式多年来一直运行良好,但仍存在一些问题。NET Roslyn团队决定是时候想出一种新的格式了。原因如下:
- Windows PDB格式很复杂,没有很好的文档记录。这种复杂性对于该格式设计的某些本机代码场景很重要,但对于其他应用程序来说是不必要的。.NET可移植格式是开源的,并有文档记录。
- 在这项工作开始时,还没有一个跨平台的库可以读取或写入原始的windows PDB格式。
- Windows PDB格式不是托管代码的紧凑表示形式。使用新格式可以在不丢失任何信息的情况下大幅缩小尺寸。
如今,Portable PDB和Windows PDB不是任何地方都支持,因此您需要考虑在哪里使用(,以决定使用哪种格式。如果您有一个项目希望能够以两种格式使用和调试,那么可以使用不同的生成配置并生成两次该项目,以支持这两种类型的使用者。
Windows PDB只能在Windows上写入或读取。除了Visual Studio代码(因为Visual Studio代码努力在所有平台上实现一致的行为)和Visual Studio正在调试远程Linux/OSX计算机的场景(因为必须在远程计算机上读取PDB)之外,所有Windows工具都支持这些功能。PortablePDB可以在任何操作系统上读取,但仍有许多地方不支持它们。比如以下情况:
- Visual Studio调试器的旧版本(VS 2015更新2之前的版本)。
- 应用程序目标.NET Framework 4.7.1或早期版本:打印堆栈跟踪,并将其映射回行号(例如在ASP.NET错误页中)。方法的名称不受影响,只支持源文件名和行号。
- C#代码分析(又名FxCop),请注意,这不适用于Roslyn Analyzer。
- 一些符号服务器。
- 运行编译后构建步骤,使用旧版本的工具(如CCI、CodeContracts)使用或修改PDB。
- 使用.NET反编译程序,如ILDASM或\NET Reflector,并希望看到源行映射或本地参数名称。
- 基于MS DIA的工具,如WinDBG。