Поддерживаемые изменения кода (C++)
В C++ большинство типов изменений, вносимых в код, обрабатывается в режиме "Изменить и продолжить". Некоторые изменения, однако, не могут быть применены во время выполнения программы. Чтобы применить эти изменения, необходимо остановить выполнение и собрать обновленную версию кода.
Сведения о работе с компонентом "Изменить и продолжить" для C++ в Visual Studio см. в разделе Изменить и продолжить (C++).
Требования
Параметры сборки (Проект > Свойства):
C/C++ > Общие > Формат отладочной информации: база данных программы для "Изменить и продолжить" (
/ZI
)Компоновщик > Общие > Включить инкрементную компоновку: да (
/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), отключает режим "Изменить и продолжить" без предупреждения.
Ограничения автоматического повторного связывания
По умолчанию функция "Изменить и продолжить" повторно компонует программу в конце сеанса отладки, чтобы создать новый исполняемый файл.
Функция "Изменить и продолжить" не может осуществлять перекомпоновку программы, если отладка выполняется не из расположения исходного построения. Сообщение говорит о том, что необходимо вручную заново осуществить построение.
Функция "Изменить и продолжить" не осуществляет повторное построение статических библиотек. При внесении изменений в статическую библиотеку в режиме «Изменить и продолжить» необходимо вручную повторно осуществить построение библиотеки и повторно скомпоновать использующие ее приложения.
Функция "Изменить и продолжить" не вызывает шаги пользовательского построения. Если программа использует пользовательские шаги построения, может возникнуть необходимость произвести построение вручную, чтобы можно было вызывать пользовательские шаги построения. В этом случае можно отключить перекомпоновку после выполнения "Изменить и продолжить", чтобы предлагалось построение заново вручную.
Отключение перекомпоновки после выполнения "Изменить и продолжить"
В меню Отладка выберите Параметры и настройки.
В диалоговом окне Параметры откройте узел Отладка и выберите узел Изменить и продолжить .
Снимите флажок Перекомпоновка изменений кода после отладки .
Ограничения предварительно скомпилированного заголовка
По умолчанию в режиме "Изменить и продолжить" загружаются и обрабатываются предкомпилированные заголовки в фоновом режиме для ускорения обработки изменений кода. Загрузка предкомпилированных заголовков требует выделения физической памяти, что может быть проблемой в случае компиляции на компьютере с ограниченной RAM. Будет ли это являться проблемой, можно определить с помощью диспетчера задач Windows, выяснив объем доступной физической памяти во время отладки. Если это количество больше размера предварительно скомпилированных заголовков, то в режиме "Изменить и продолжить" не должно возникнуть проблем. Если объем свободной памяти меньше объема, необходимого для прекомпилированных заголовков, можно запретить средству "Изменить и продолжить" загружать прекомпилированные заголовки в фоновом режиме.
Чтобы отключить фоновую загрузку прекомпилированных заголовков для средства "Изменить и продолжить"
В меню Отладка выберите Параметры и настройки.
В диалоговом окне Параметры откройте узел Отладка и выберите узел Изменить и продолжить .
Снимите флажок Разрешить прекомпиляцию .
Ограничения атрибутов IDL
Изменение и продолжение не создает файлы языка определения интерфейса (IDL). Как следствие, изменения в атрибутах IDL не отображаются в ходе отладки. Для того чтобы увидеть изменения в атрибутах IDL, необходимо остановить процесс отладки и заново осуществить построение приложения. При режиме "Изменить и продолжить" не выводится сообщение об ошибке или предупреждение при изменении атрибутов IDL. Дополнительные сведения см. в разделе Атрибуты IDL.
Диагностические проблемы
Если ваш сценарий не соответствует ни одному из указанных выше условий, можно собрать дополнительные сведения, задав следующий параметр реестра DWORD:
- Откройте командную строку разработчика.
- Выполните следующую команду:
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
Установка этого значения в начале сеанса отладки приводит к тому, что различные компоненты функции "Изменить и продолжить" выдают подробные сведения о ведении журнала на панели Окно вывода>Отладка.