符号

符号可用于调试和其他诊断工具。 符号文件的内容在语言、编译器和平台之间各有不同。 概括而言,符号是源代码和编译器生成的二进制文件之间的映射。 Visual StudioVisual 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。

另请参阅