Символы
Символы полезны при отладке и в других диагностических средствах. Файлы символов будут иметь разное содержимое в зависимости от языка, компилятора и платформы. На высоком уровне символы — это сопоставление исходного кода и двоичного файла, созданного компилятором. Эти сопоставления используются такими инструментами, как Visual Studio, и Visual Studio Code для разрешения номеров строк исходного кода или имен локальных переменных.
Документация по Windows по символам содержит более подробную информацию о символах для Windows, хотя многие из концепций также применимы и к другим платформам.
Дополнительные сведения. Переносимый PDB-формат NET
.NET Core представил новый формат файла символов (PDB) — переносимого PDB. В отличие от традиционных PDOB-файлов, которые доступны только для Windows, переносимые PDF-файлы можно создавать и читать на всех платформах.
Что такое PDB-файл?
PDB-файл — это вспомогательный файл, создаваемый компилятором для предоставления другим средствам, особенно отладчикам, сведений о том, что находится в основном исполняемом файле и как он был создан. Например, отладчик считывает PDB-файл для сопоставления строки 12 в файле foo.cs правильному расположению в исполняемом файле, чтобы можно было установить точку останова. Формат файлов PDB для Windows существует уже давно, и он развился из других собственных форматов символов отладки, которые появились еще раньше. Он появился в виде формата для собственных программ (C/C++). После первого выпуска платформы .NET Framework формат Windows PDB был расширен для поддержки .NET.
Формат переносимой PDB был представлен в .NET Core, и он используется по умолчанию при целевом объекте .NET. При выборе платформа .NET Framework можно включить переносимые символы PDB, указав <DebugType>portable</DebugType>
в файле проекта. Переносимый формат PDB основан на формате метаданных ECMA-335. Дополнительные сведения см. в статье "Переносимая PDB версии 1.0: спецификация формата". Средства диагностики могут использовать библиотеку System.Reflection.Metadata для чтения переносимых PDB-файлов (см. пример System.Reflection.Metadata.Document).
Использование правильного формата PDB в конкретном сценарии
Ни переносимые ПД, ни PDF-файлы Windows не поддерживаются везде. Чтобы решить, какой формат следует использовать, рассмотрите место использования и отладки проекта. Если у вас есть проект, который вы хотите использовать и выполнять его отладку в обоих форматах, можно использовать разные конфигурации сборки и дважды собрать проект для поддержки обоих типов потребителей.
Поддержка переносимых PDB-файлов
Переносимая PDB может быть прочитана в любой операционной системе и является рекомендуемой форматом символов для управляемого кода. Однако существует ряд устаревших средств и приложений, где они не поддерживаются:
Приложения, предназначенные для платформы .NET Framework 4.7.1 или более ранней версии: печать трассировок стека с обратным сопоставлением с номерами строк (например, на странице ошибки ASP.NET). Это не касается имен методов, не поддерживаются только имена исходных файлов и номера строк.
При использовании декомпилеров .NET, таких как ildasm или рефлектор .NET, вы не увидите сопоставления исходных строк или имена локальных параметров.
Последние версии DIA и инструментов, которые используют DIA для чтения символов, таких как WinDBG, поддерживают переносимые PDB, но старые версии не поддерживают.
Могут быть более старые версии профилировщиков, которые не поддерживают переносимые PDF-файлы.
Чтобы использовать переносимые PDF-файлы в средствах, которые не поддерживают их, можно использовать Pdb2Pdb, который преобразуется между переносимыми PDB и PDF-файлами Windows.
Поддержка файлов PDB Windows
Файлы PDB Windows можно записывать и читать только в Windows. Использование PDB-файлов Windows для управляемого кода является устаревшим и используется только для устаревших средств. Рекомендуется использовать переносимые PDF-файлы вместо PDF-файлов Windows, так как некоторые новые функции компилятора реализуются только для переносимых PDF-файлов.
См. также
- Для скачивания файлов символов для двоичных модулей платформы можно использовать средство dotnet-symbol
- Документация Windows по символам