Поделиться через


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

Замечание

Эта статья связана с .NET Framework. Он не применяется к более новым реализациям .NET, включая .NET 6 и более поздние версии.

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

При компиляции управляемого кода .NET Framework компиляторы, такие как Visual C++, Visual Basic и C# компилируют исходную программу на общий промежуточный язык (CIL). Затем CIL компилируется с помощью JIT в машинный код непосредственно перед выполнением. Как и в неуправляемом коде, можно настроить исполняемый образ для отладки, задав параметры IDE или параметры командной строки. Вы также можете настроить 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 должен присутствовать в целевой папке, когда выполняется Ngen.exe. Если вы предварительно компилировали сборку без оптимизации, необходимо удалить предварительно скомпилированный код с помощью параметра NGen.exe /remove , прежде чем повторно запустить Ngen.exe, чтобы предварительно компилировать код как оптимизированный. Если файл .ini отсутствует в папке, по умолчанию Ngen.exe предварительно компилирует код как оптимизированный.

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

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

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

Замечание

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

См. также