Упрощение отладки образов
Обновлен: Ноябрь 2007
При компиляции неуправляемого кода можно настроить исполняемый образ для отладки, задав параметры командной строки и переключатели интегрированной среды разработки. Например, параметр командной строки /zi в Visual C++ служит для запуска отладки файлов символов (с расширением PDB). Аналогичным образом параметр командной строки /od отключает оптимизацию компилятора. В результате выполнение кода происходит медленнее, однако при необходимости это упрощает его отладку.
При компиляции управляемого кода .NET Framework компиляторы (например, Visual C++, Visual Basic и C#) компилируют исходную программу в промежуточный язык MSIL (Microsoft Intermediate Language). Далее, перед выполнением MSIL преобразуется в исходный машинный код с помощью JIT-компиляции. Как и в случае с неуправляемым кодом, можно настроить исполняемый файл (образ) для отладки, задав параметры командной строки и переключатели интегрированной среды разработки. Кроме того, таким же образом можно настроить для отладки JIT-компиляцию.
Данная JIT-конфигурация имеет два аспекта:
С помощью JIT-компилятора можно задать создание сведений об отслеживании. После этого отладчик сможет сопоставлять цепочки команд MSIL с соответствующими командами машинного кода, а также отслеживать место хранения локальных переменных и аргументов функций. В .NET Framework версии 2.0 JIT-компилятор всегда генерирует сведения об отслеживании, поэтому нет необходимости запрашивать их специально.
С помощью JIT-компилятора можно отключить оптимизацию получившегося машинного кода.
Как правило, параметры JIT-компилятора задаются компилятором, создающим команды MSIL, на основе заданных переключателей интегрированной среды разработки или указанных параметров командной строки (например, /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-файл, содержащий параметр AllowOptimze=0, должен находиться в целевой папке во время выполнения Ngen.exe. При предварительной компиляции сборки без оптимизации следует удалить предварительно скомпилированный код с помощью параметра NGen.exe /uninstall прежде, чем перезапустить Ngen.exe для предварительной компиляции оптимизированного кода. Если файл INI не находится в папке, Ngen.exe по умолчанию предварительно компилирует код как оптимизированный. |
Примечание. |
---|
System.Diagnostics.DebuggableAttribute управляет настройками для сборки. DebuggableAttribute содержит два поля для записи параметров, определяющих, выполняет ли JIT-компилятор оптимизацию и/или создает данные для отслеживания. В .NET Framework версии 2.0 JIT-компилятор всегда генерирует сведения об отслеживании. |
Примечание. |
---|
Для коммерческого построения параметры DebuggableAttribute не задаются компилятором. По умолчанию JIT-компилятор настроен на самую высокую производительность, что затрудняет отладку машинного кода. Включение JIT-отслеживания несколько снижает производительность; отключение оптимизации снижает производительность значительно. |
Примечание. |
---|
DebuggableAttribute одновременно применяется ко всей сборке, а не к ее отдельным модулям. Средства разработки должны, таким образом, подключать пользовательские атрибуты к классу System.CompilerServices.AssemblyAttributesGoHere или, если создана сборка, к лексеме метаданных сборки. Средство ALink выполняет перемещение атрибутов DebuggableAttribute из каждого модуля в сборку, частью которой они становятся. Возникновение конфликта вызывает сбой в работе Alink. |
Примечание. |
---|
В среде .NET Framework версии 1.0 DebuggableAttribute добавляется компилятором Microsoft Visual C++, если указаны параметры компилятора /clr и /Zi. В среде .NET Framework версии 1.1 DebugabbleAttribute может быть добавлен как вручную (в коде), так и с помощью параметра /ASSEMBLYDEBUG компоновщика. |
См. также
Основные понятия
Включение отладки с JIT-присоединением