符号

符号可用于调试和其他诊断工具。 符号文件的内容因语言、编译器和平台而异。 概括而言,符号是源代码与编译器生成的二进制文件之间的映射。 Visual Studio 和 Visual Studio Code 等工具使用这些映射来解析源行号信息或本地变量名称。

有关符号的 Windows 文档包含有关 Windows 符号的更多详细信息,尽管许多概念也适用于其他平台。

了解 。NET 的可移植 PDB 格式

.NET Core 引入了新的符号文件 (PDB) 格式 - 可移植 PDB。 与传统的 PDB(仅限 Windows)不同,可以在所有平台上创建和读取可移植 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 读取符号的工具(如 WinDBG)和最新版本的 DIA 支持可移植 PDB,但旧版本不支持。

  • 可能存在不支持可移植 PDB 的较旧版本的探查器。

若要在不支持它们的工具上使用可移植 PDB,可以使用 Pdb2Pdb,该 Pdb 可在可移植 PDB 和 Windows PDB 之间转换。

对 Windows PDB 的支持

Windows PDB 只能在 Windows 上写入或读取。 对托管代码使用 Windows PDB 的操作已过时,且只有旧版工具需要此操作。 建议使用可移植 PDB 而不是 Windows PDB,因为某些较新的编译器功能仅适用于可移植 PDB。

另请参阅