Упрощение отладки образа в .NET

При компиляции неуправляемого кода можно настроить исполняемый образ для отладки, задав параметры командной строки или интегрированной среды разработки. Например, параметр командной строки /Zi в Visual C++ служит для создания файлов с отладочными символами (с расширением PDB). Аналогичным образом параметр командной строки /Od отключает оптимизацию компилятора. Результирующий код выполняется медленнее, но его проще отладить, если это необходимо.

При компиляции управляемого кода платформа .NET Framework компиляторы, такие как Visual C++, Visual Basic и C# компилируют исходную программу на общий промежуточный язык (CIL). Затем CIL компилируется JIT-код перед выполнением в машинном коде. Как и в случае с неуправляемым кодом, можно настроить исполняемый образ для отладки, задав параметры командной строки или интегрированной среды разработки. Вы также можете настроить JIT-компиляцию для отладки точно так же.

Данная JIT-конфигурация имеет два аспекта.

  • Вы можете запросить JIT-компилятор для создания сведений об отслеживании. Это позволяет отладчику сопоставлять цепочку CIL со своим аналогом кода компьютера, а также отслеживать, где хранятся локальные переменные и аргументы функций. В платформа .NET Framework версии 2.0 и более поздних версиях компилятор JIT всегда создает сведения об отслеживании, поэтому не требуется запрашивать его.

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

Как правило, компилятор, создающий CIL, задает эти параметры компилятора JIT соответствующим образом на основе параметров интегрированной среды разработки или параметров командной строки, указанных, например /Od.

В некоторых случаях может возникнуть необходимость изменить поведение JIT-компилятора, чтобы создаваемый машинный код было проще отлаживать. Например, для окончательной сборки или оптимизации управления может потребоваться создать сведения о JIT-отслеживании. Это можно сделать с помощью файла инициализации (INI).

Например, если сборка, которую требуется выполнить отладку, вызывается MyApp.exe, можно создать текстовый файл с именем MyApp.ini, в той же папке, что и MyApp.exe, которая содержит эти три строки:

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

Значением каждого параметра может быть 0 или 1; отсутствующие параметры получают значение 0. Для упрощения отладки значение GenerateTrackingInfo должно быть равным 1, а значение AllowOptimize — 0.

Начиная с платформа .NET Framework 2.0 компилятор JIT всегда создает данные отслеживания независимо от значенияGenerateTrackingInfo; AllowOptimize однако значение по-прежнему имеет эффект. При использовании Ngen.exe (средства для создания образов в машинном коде) для предварительной компиляции образа в машинном коде без оптимизации INI-файл, содержащий параметр AllowOptimize=0, должен находиться в целевой папке во время выполнения Ngen.exe. Если вы предварительно компилировали сборку без оптимизации, необходимо удалить предварительно скомпилированный код с помощью параметра NGen.exe /remove, прежде чем повторно запустить Ngen.exe, чтобы предварительно компилировать код как оптимизированный. Если файл .ini отсутствует в папке, по умолчанию Ngen.exe предварительно компилирует код как оптимизированный.

System.Diagnostics.DebuggableAttribute управляет параметрами для сборки. DebuggableAttribute включает в себя два поля, которые определяют, должен ли компилятор JIT оптимизировать и /или создать сведения об отслеживании. В платформа .NET Framework версии 2.0 и более поздних версий компилятор JIT всегда создает сведения об отслеживании.

Для розничной сборки компиляторы не задают ни одного отладчикаAttribute. По умолчанию компилятор JIT создает самую высокую производительность, самую трудную отладку кода компьютера. Включение JIT-отслеживания несколько снижает производительность; отключение оптимизации снижает производительность значительно.

DebuggableAttribute одновременно применяется ко всей сборке, а не к ее отдельным модулям. Средства разработки должны, таким образом, подключать пользовательские атрибуты к классу System.Runtime.CompilerServices.AssemblyAttributesGoHere или, если сборка уже создана, к токену метаданных сборки. Затем средство ALink продвигает эти атрибуты DebuggableAttribute из каждого модуля в сборку, из которых они становятся частью. При возникновении конфликта операция ALink завершается ошибкой.

Примечание.

В .NET Framework версии 1.0 DebuggableAttribute добавляется компилятором Microsoft Visual C++, если указаны параметры компилятора /clr и /Zi. В версии 1.1 платформа .NET Framework необходимо вручную добавить отладчикAttribute или использовать параметр компоновщика /ASSE МБ LYDEBUG.

См. также