符号
符号可用于调试和其他诊断工具。 符号文件的内容在语言、编译器和平台之间各有不同。 概括而言,符号是源代码和编译器生成的二进制文件之间的映射。 Visual Studio 和 Visual Studio Code 等工具会使用这些映射来解析源行号信息或本地变量名称。
可在有关符号的 Windows 文档中更详细地了解适用于 Windows 的符号,不过其中很多概念也不用于其他平台。
了解 .NET 的可移植 PDB 格式
.NET Core 引入了一种新的符号文件 (PDB) 格式,即可移植 PDB。 与仅限 Windows 的传统 PDB 不同,可在任意平台上创建和读取可移植 PDB。
什么是 PDB?
PDB 文件是编译器生成的辅助文件,目的是向其他工具(尤其是调试程序)提供主可执行文件中的内容及其生成方式的相关信息。 例如,调试程序读取 PDB 来将 foo.cs 第 12 行映射到适当的可执行文件位置,以便它可设置断点。 Windows PDB 格式已存在很长时间,它是从甚至更久远的其他本机调试符号格式演变而来的。 它最初是用作本机 (C/C++) 程序的一种格式。 针对 .NET Framework 的首次发布,Windows PDB 格式进行了扩展以支持 .NET。
可移植 PDB 格式是在 .NET Core 中引入的,在面向 .NET 时默认使用。 当面向 .NET Framework 时,可通过在项目文件中指定 <DebugType>portable</DebugType>
来启用可移植 PDB 符号。 可移植 PDB 格式基于 ECMA-335 元数据格式。 有关详细信息,请参阅可移植 PDB v1.0:格式规范。 诊断工具可使用 System.Reflection.Metadata 库读取可移植 PDB 文件(如需相关示例,请参阅 System.Reflection.Metadata.Document)。
使用适合你的方案的 PDB 格式
任何位置都不支持可移植 PDB 和 Windows PDB。 若要确定使用哪种格式,请考虑要在哪里使用和调试你的项目。 如果你有一个项目,而你希望它能在这两种格式中使用和调试,那么可使用不同的生成配置,并生成项目两次以同时支持这两种类型的使用者。
支持可移植 PDB
可在任何操作系统上读取可移植 PDB,并且后者是托管代码的推荐符号格式。 但是,许多旧版工具和应用程序不受支持:
面向 .NET Framework 4.7.1 或更低版本的应用程序:将带有映射的堆栈跟踪打印回行号(例如在 ASP.NET 错误页面中)。 方法的名称不受影响,只有源文件名和行号不受支持。
使用 .NET 反编译程序(例如 ildasm 或 .NET 反射器)时,你将看不到源行映射或本地参数名称。
最新版本的 DIA 和使用 DIA 来读取符号的工具(例如 WinDBG)支持可移植 PDB,但旧版本不支持。
可能存在不支持可移植 PDB 的旧版本的探查器。
若要在不支持可移植 PDB 的工具上使用这些格式,可使用 Pdb2Pdb,它会在可移植 PDB 和 Windows PDB 之间进行转换。
支持 Windows PDB
仅可在 Windows 上编写或读取 Windows PDB。 对托管代码使用 Windows PDB 的操作已过时,且只有旧版工具需要此操作。 建议使用可移植 PDB 而不是 Windows PDB,原因是一些更新的编译器功能仅支持可移植 PDB。
另请参阅
- dotnet-symbol 可用于下载框架二进制文件的符号文件
- 有关符号的 Windows 文档