Подтвердить что ты не робот

PDB файлы для производственного приложения и флаг "Оптимизировать код"

Когда я должен включать файлы PDB для выпуска продукции? Должен ли я использовать флаг Optimize code и как это повлияет на информацию, полученную из исключения?

Если есть заметное преимущество в производительности, я бы хотел использовать оптимизацию, но если бы не я имел точную информацию об отладке. Что обычно делается для производственного приложения?

4b9b3361

Ответ 1

Если вы хотите видеть исходные имена файлов и номера строк в ваших стеках стека, сгенерируйте PDB, используя параметр pdb-only. Оптимизация отделена от поколения PDB, т.е. Вы можете оптимизировать и генерировать PDB без снижения производительности.

Из справочник по языку С#

Если вы используете /debug: full, имейте в виду, что есть определенное влияние на скорость и размер оптимизированного кода JIT и небольшое влияние на качество кода с /debug: full. Мы рекомендуем /debug: pdbonly или no PDB для генерации кода выпуска.

Ответ 2

Чтобы ответить на ваш первый вопрос, вам нужно включить PDB для выпускной версии, если вам нужны номера строк для ваших отчетов об исключениях.

Чтобы ответить на ваш второй вопрос, использование флага "Оптимизация" с PDB означает, что любой stack "collapse" будет отражен в трассировке стека. Я не уверен, может ли фактический номер строки быть ошибочным - это требует большего изучения.

Чтобы ответить на третий вопрос, вы можете получить лучшее из обоих миров с довольно аккуратным трюком. Основные отличия между сборкой отладки по умолчанию и сборкой по умолчанию - это то, что при выполнении стандартной версии выпуска оптимизация включается, а символы отладки не испускаются. Итак, в четыре этапа:

  • Измените конфигурацию выпуска, чтобы испустить символы отладки. Это практически не влияет на производительность вашего приложения, и очень полезно, если (когда?) Вам нужно отладить выпускную версию вашего приложения.

  • Скомпилируйте, используя новую конфигурацию сборки релиза, то есть с символами отладки и с оптимизацией. Обратите внимание, что 99% оптимизации кода выполняется компилятором JIT, а не компилятором языка.

  • Создайте текстовый файл в папке приложения с именем xxxx.exe.ini(или dll или что-то еще), где xxxx - это имя исполняемого файла. Первоначально этот текстовый файл должен выглядеть так:

    [.NET Framework Debugging Control]
    GenerateTrackingInfo=0
    AllowOptimize=1
    
  • С этими настройками приложение работает на полной скорости. Если вы хотите отлаживать свое приложение, включив оптимизацию кода отладки и, возможно, отключив (CIL), просто используйте следующие настройки:

    [.NET Framework Debugging Control]
    GenerateTrackingInfo=1
    AllowOptimize=0 
    

EDIT. Согласно комментарию cateye, это также может работать в размещенной среде, такой как ASP.NET.

Ответ 3

Нет необходимости включать их в свой дистрибутив, но вы должны обязательно их строить и хранить. В противном случае отладка аварийного сброса практически невозможна.

Я бы также включил оптимизацию. Хотя это затрудняет отладку, прирост производительности обычно очень нетривиальный в зависимости от характера приложения. Мы легко видим более 10-кратную производительность при выпуске отладочных сборников для некоторых алгоритмов.