В чем разница между использованием ‹DebugType› Full ‹/DebugType› и ‹DebugType› Portable ‹/DebugType› для основных проектов .net?

Чтобы сгенерировать отчет об открытой обложке, мне нужно сделать debugType как Full. Я создаю отчет на сервере сборки, так как я должен завершить сборку, если покрытие не достигает определенного порога. Сборка создается в режиме выпуска. Какие последствия имеет сохранение значения debugType Full в моем файле csproj? Будет ли это ухудшать производительность в производстве?


person Viraj Pangam    schedule 24.10.2017    source источник
comment
разница между / debug: pdbonly и / debug: full заключается в том, что с / debug: full компилятор испускает DebuggableAttribute, который используется, чтобы сообщить компилятору JIT о доступности отладочной информации   -  person Anant Dabhi    schedule 24.10.2017
comment
Это ухудшит производительность в продакшене?   -  person Viraj Pangam    schedule 24.10.2017
comment
@AnantDabhi, вопрос не в pdbonly, а в /debug:portable эквивалентном аргументе (похоже, официальные документы не были обновлены, чтобы включить его)   -  person Martin Ullrich    schedule 24.10.2017
comment
Это задокументировано, цитата: если вы используете / debug: full, имейте в виду, что есть некоторое влияние на скорость и размер JIT-оптимизированного кода и небольшое влияние на качество кода с / debug: full. Мы рекомендуем / debug: pdbonly или no PDB для генерации кода выпуска. Побочные эффекты / debug: portable не задокументированы, для одного отсутствует опция для / исключения файла + информация о номере строки, так что это может когда-нибудь измениться.   -  person Hans Passant    schedule 24.10.2017


Ответы (2)


Разница в том, что «полный» тип генерирует классический файл символов Windows PDB, который сложен и плохо документирован. «Портативный» формат PDB - это новый формат с открытым исходным кодом, который можно создавать и использовать на всех платформах. Дополнительную информацию об этом формате можно найти в документации по dotnet основное репо.

Это не имеет ничего общего с тем, можно ли отладить приложение, а скорее с инструментами, которые поддерживают новый или классический формат. Таким образом, нет никаких последствий во время выполнения (за исключением печати трассировки стека в .NET Framework ‹4.7.1, когда вы отправляете переносимые файлы pdb вместе с приложением и хотите увидеть отображение номеров строк).

Поэтому, пока инструменты не будут обновлены для работы с новым форматом, вам нужно будет изменить свойство DebugType на Full, если вам нужно использовать инструменты, которые еще не поддерживают новый формат, который теперь используется по умолчанию для проектов на основе SDK.

Чтобы сделать это только для отладочных сборок, вам нужно, чтобы ваш csproj содержал такой раздел, как

<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
  <DebugType>Full</DebugType>
</PropertyGroup>
person Martin Ullrich    schedule 24.10.2017
comment
Итак, я могу с уверенностью заключить, что могу использовать DebugType Full, не беспокоясь о каком-либо снижении производительности? - person Viraj Pangam; 24.10.2017
comment
пока вы делаете это только в режиме отладки, да - person Martin Ullrich; 24.10.2017
comment
добавлен пример конфигурации csproj - person Martin Ullrich; 24.10.2017
comment
Это означает, что если я сделаю это для режима выпуска, это вызовет проблему? - person Viraj Pangam; 24.10.2017
comment
Да, так как это отключит оптимизацию кода во время выполнения - person Martin Ullrich; 24.10.2017
comment
Это не влияет на производительность даже в Full. См. Пояснения на странице github.com/dotnet/corefx/issues/28301. - person nothrow; 31.08.2018
comment
Однако в версии 4.7.1 произошло снижение производительности - github.com/Microsoft/dotnet/issues/ 529 - person Martin Ullrich; 31.08.2018

С Visual Studio 2013 (Roslyn) нет разницы между full и pdb-only. Мы должны обновить документы. @VSadov

https://github.com/dotnet/runtime/issues/25550#issuecomment-374996117

person dimaaan    schedule 08.09.2020