Поддерживаемые изменения кода (C++)

В C++ большинство типов изменений, вносимых в код, обрабатывается в режиме "Изменить и продолжить". Некоторые изменения, однако, не могут быть применены во время выполнения программы. Чтобы применить эти изменения, необходимо остановить выполнение и собрать обновленную версию кода.

Сведения о работе с компонентом "Изменить и продолжить" для C++ в Visual Studio см. в разделе Изменить и продолжить (C++).

Требования

Параметры сборки (Проект > Свойства):

  1. C/C++ > Общие > Формат отладочной информации: база данных программы для "Изменить и продолжить" (/ZI)

  2. Компоновщик > Общие > Включить инкрементную компоновку: да (/INCREMENTAL)

    Любые несовместимые параметры компоновщика (такие как /SAFESEH или /OPT:...) должны вызвать предупреждение LNK4075 во время сборки.
    Пример: LINK : warning LNK4075: ignoring '/INCREMENTAL' due to '/OPT:ICF' specification

Параметры отладчика (Отладка > Параметры > Общие):

  • Включение функции "Изменить машинный код и продолжить"

    Любые несовместимые параметры компилятора или компоновщика вызывают ошибку во время операции "Изменить и продолжить".
    Пример: Edit and Continue : error : ‘file.cpp’ in ‘MyApp.exe’ was not compiled with Edit and Continue enabled. Ensure that the file is compiled with the Program Database for Edit and Continue (/ZI) option.

Неподдерживаемые изменения

Следующие изменения в коде C/C++ не могут быть применены во время сеанса отладки. Если внести любое из таких изменений и попытаться применить его, в окне Вывод отобразится сообщение об ошибке или предупреждение.

  • Большинство изменений в глобальных или статических данных.

  • Изменения в исполняемых файлах, которые были скопированы с другого компьютера, а не собраны локально.

  • Изменения в типах данных, которые влияют на структуру объекта, например изменения в данных-членах класса.

  • Добавление более 64 Кбайт нового кода или данных.

  • Добавление переменных, требующих конструктор в точке, предшествующей указателю инструкции.

  • Изменения, которые влияют на код, требующий инициализации во время выполнения.

  • Добавление обработчиков исключений в некоторых экземплярах.

  • Изменения в файлах ресурсов.

  • Изменения в коде файлов, доступных только для чтения.

  • Изменения в коде при отсутствии соответствующего PDB-файла.

  • Изменения в коде, для которого отсутствует объектный файл.

  • Изменение лямбда-кодов, которые:
    • имеют статический или глобальный член;
    • передаются в функцию std::function; это приводит к нарушению подлинности ODR и к ошибке C1092.
  • Операция "Изменить и продолжить" не обновляет статические библиотеки. При внесении изменения в статическую библиотеку выполнение будет продолжено со старой версией без выдачи предупреждения.

Неподдерживаемые сценарии

Операция "Изменить и продолжить" для C/C++ не доступна в следующих сценариях отладки:

  • Отладка собственных приложений, скомпилированных с помощью компилятора /Zo (улучшение оптимизированного процесса отладки)

  • Проекты, использующие набор инструментов VC 120 и коммутатор C/C++ /bigobj . Компонент "Изменить и продолжить" с /bigobj поддерживается только в наборе инструментов VC 140.

  • отладка в смешанном режиме (машинный код/управляемый код);

  • отладка JavaScript;

  • отладка SQL;

  • отладка с использованием файла дампа;

  • изменение кода после необработанного исключения, когда не включен параметр Очищать стек вызовов от кадров необработанных исключений ;

  • отладка приложения с использованием команды Присоединиться к вместо запуска приложения кнопкой Пуск в меню Отладка ;

  • отладка оптимизированного кода;

  • отладка старой версии кода после того, как новую версию не удалось собрать из-за ошибок сборки.

  • С помощью настраиваемого пути компилятора (CL. exe). Из соображений безопасности для перекомпиляции файла во время операции "Изменить и продолжить" в Visual Studio всегда используется установленный компилятор. Если вы используете пользовательский путь компилятора (например, через пользовательскую переменную $(ExecutablePath) в файле *.props), появится предупреждение, и Visual Studio возвращается к использованию установленного компилятора той же версии или архитектуры.

  • Устаревшие архитектуры и наборы инструментов VC. При использовании набора инструментов VC 140 отладчик по умолчанию поддерживает операции "Изменить и продолжить" в приложениях x86 и x64. Устаревшие наборы инструментов поддерживают только приложения x86. Наборы инструментов старше VC 120 должны использовать устаревший отладчик. Для использования функции "Изменить и продолжить" установите флажок "Отладка > Параметры > Общие > Использовать режим совместимости машинного кода".

Ограничения компоновки

Параметры компоновщика, отключающие режим «Изменить и продолжить»

Следующие параметры компоновщика отключают режим "Изменить и продолжить".

  • Параметры /OPT:REF, /OPT:ICFи /INCREMENTAL:NO отключают режим "Изменить и продолжить" со следующим предупреждением:
    LINK : warning LNK4075: ignoring /EDITANDCONTINUE due to /OPT specification

  • Параметры /ORDER, /RELEASEи /FORCE отключают режим "Изменить и продолжить" со следующим предупреждением:
    LINK : warning LNK4075: ignoring /INCREMENTAL due to /option specification

  • Установка любых параметров, предотвращающих создание файла программной базы данных (.PDB), отключает режим "Изменить и продолжить" без предупреждения.

Ограничения автоматического повторного связывания

По умолчанию функция "Изменить и продолжить" повторно компонует программу в конце сеанса отладки, чтобы создать новый исполняемый файл.

Функция "Изменить и продолжить" не может осуществлять перекомпоновку программы, если отладка выполняется не из расположения исходного построения. Сообщение говорит о том, что необходимо вручную заново осуществить построение.

Функция "Изменить и продолжить" не осуществляет повторное построение статических библиотек. При внесении изменений в статическую библиотеку в режиме «Изменить и продолжить» необходимо вручную повторно осуществить построение библиотеки и повторно скомпоновать использующие ее приложения.

Функция "Изменить и продолжить" не вызывает шаги пользовательского построения. Если программа использует пользовательские шаги построения, может возникнуть необходимость произвести построение вручную, чтобы можно было вызывать пользовательские шаги построения. В этом случае можно отключить перекомпоновку после выполнения "Изменить и продолжить", чтобы предлагалось построение заново вручную.

Отключение перекомпоновки после выполнения "Изменить и продолжить"

  1. В меню Отладка выберите Параметры и настройки.

  2. В диалоговом окне Параметры откройте узел Отладка и выберите узел Изменить и продолжить .

  3. Снимите флажок Перекомпоновка изменений кода после отладки .

Ограничения предварительно скомпилированного заголовка

По умолчанию в режиме "Изменить и продолжить" загружаются и обрабатываются предкомпилированные заголовки в фоновом режиме для ускорения обработки изменений кода. Загрузка предкомпилированных заголовков требует выделения физической памяти, что может быть проблемой в случае компиляции на компьютере с ограниченной RAM. Будет ли это являться проблемой, можно определить с помощью диспетчера задач Windows, выяснив объем доступной физической памяти во время отладки. Если это количество больше размера предварительно скомпилированных заголовков, то в режиме "Изменить и продолжить" не должно возникнуть проблем. Если объем свободной памяти меньше объема, необходимого для прекомпилированных заголовков, можно запретить средству "Изменить и продолжить" загружать прекомпилированные заголовки в фоновом режиме.

Чтобы отключить фоновую загрузку прекомпилированных заголовков для средства "Изменить и продолжить"

  1. В меню Отладка выберите Параметры и настройки.

  2. В диалоговом окне Параметры откройте узел Отладка и выберите узел Изменить и продолжить .

  3. Снимите флажок Разрешить прекомпиляцию .

Ограничения атрибутов IDL

Изменение и продолжение не создает файлы языка определения интерфейса (IDL). Как следствие, изменения в атрибутах IDL не отображаются в ходе отладки. Для того чтобы увидеть изменения в атрибутах IDL, необходимо остановить процесс отладки и заново осуществить построение приложения. При режиме "Изменить и продолжить" не выводится сообщение об ошибке или предупреждение при изменении атрибутов IDL. Дополнительные сведения см. в разделе Атрибуты IDL.

Диагностические проблемы

Если ваш сценарий не соответствует ни одному из указанных выше условий, можно собрать дополнительные сведения, задав следующий параметр реестра DWORD:

  1. Откройте командную строку разработчика.
  2. Выполните следующую команду:
    VsRegEdit.exe set “C:\Program Files\Microsoft Visual Studio\[Version]\[YOUR EDITION]” HKCU Debugger NativeEncDiagnosticLoggingLevel DWORD 1
    VsRegEdit.exe set “C:\Program Files (x86)\Microsoft Visual Studio\[Version]\[YOUR EDITION]” HKCU Debugger NativeEncDiagnosticLoggingLevel DWORD 1

Установка этого значения в начале сеанса отладки приводит к тому, что различные компоненты функции "Изменить и продолжить" выдают подробные сведения о ведении журнала на панели Окно вывода>Отладка.