다음을 통해 공유


지원되는 코드 변경(C++)

C++ 프로젝트에 대한 편집 및 계속은 대부분의 코드 변경 유형을 처리합니다. 그러나 프로그램 실행 중에는 일부 변경 내용을 적용할 수 없습니다. 이러한 변경 내용을 적용하려면 실행을 중지하고 새 버전의 코드를 빌드해야 합니다.

Visual Studio에서 C++용 편집 및 계속 작업에 대한 자세한 내용은 편집 및 계속(C++) 을 참조하세요.

요구 사항

빌드 설정(프로젝트 > 속성)

  • C/C++ > 일반 > 디버그 정보 형식: 편집하며 계속하기 위한 프로그램 데이터베이스(/ZI)

  • 링커 > 일반 > 증분 연결 사용: 예(/INCREMENTAL)

    호환되지 않는 링커 설정(예: /SAFESEH또는 /OPT:...)은 빌드 중에 경고 LNK4075 발생할 수 있습니다. 예: LINK : warning LNK4075: ignoring '/INCREMENTAL' due to '/OPT:ICF' specification

디버거 설정(디버그 > 옵션)

디버그(또는 도구) >옵션 창을 열고 모든 설정>디버깅>.NET/C++ 핫 다시 로드 섹션을 확장합니다.

디버그(또는 도구) >옵션 대화 상자를 열고 Debugging.NET>/C++ 핫 다시 로드 섹션을 확장합니다.

다음 옵션 중 하나 또는 모두를 선택하여 기능을 사용하도록 설정합니다.

  • 핫 다시 로드 사용: 연결된 디버거(F5)로 시작할 때 핫 다시 로드를 사용하도록 설정합니다.

  • 디버깅하지 않고 시작할 때 핫 다시 로드 사용: 디버거를 연결 하지 않고 시작할 때 핫 다시 로드를 사용하도록 설정합니다(Ctrl + F5).

  • 파일 저장 시 핫 다시 로드 사용: 파일을 저장할 때 핫 다시 로드를 사용하도록 설정합니다.

  • 로깅 세부 정보: 핫 다시 로드를 사용하도록 설정할 때 로깅 수준을 설정합니다. 최소(기본값), 상세 또는 진단 중에서 선택합니다.

이러한 설정을 변경하면 작업 중인 모든 프로젝트에 영향을 줍니다. 설정을 변경한 후에는 애플리케이션을 다시 빌드할 필요가 없습니다. 명령줄 또는 메이크파일에서 애플리케이션을 빌드하지만 Visual Studio 환경에서 디버그하는 경우 옵션을 설정한 /ZI 경우에도 편집하며 계속하기를 사용할 수 있습니다.

디버그(또는 도구) >옵션 대화 상자에서 디버깅> 섹션을 확장하고 네이티브 편집 및 계속 사용 확인란을 선택합니다.

호환되지 않는 컴파일러 또는 링커 설정은 편집하고 계속하는 동안 오류가 발생합니다.
예: 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++ 변경 내용을 적용할 수 없습니다. 이러한 변경 내용을 적용한 다음 코드 변경 내용을 적용하려고 하면 출력 창에 오류 또는 경고 메시지가 나타납니다.

  • 전역 또는 정적 데이터에 대한 대부분의 변경 내용입니다.

  • 다른 컴퓨터에서 복사되고 로컬로 빌드되지 않은 실행 파일에 대한 변경 내용입니다.

  • 클래스의 데이터 멤버와 같이 개체의 레이아웃에 영향을 주는 데이터 형식을 변경합니다.

  • 64k 바이트 이상의 새 코드 또는 데이터 추가

  • 명령 포인터 앞의 지점에서 생성자가 필요한 변수를 추가합니다.

  • 런타임 초기화가 필요한 코드에 영향을 주는 변경 내용입니다.

  • 일부 인스턴스에서 예외 처리기 추가

  • 리소스 파일을 변경합니다.

  • 읽기 전용 파일의 코드 변경 내용입니다.

  • 해당 PDB 파일 없이 코드를 변경합니다.

  • 개체 파일이 없는 코드의 변경 내용입니다.

  • 다음 시나리오에서 람다 수정:

    • 람다에 정적 또는 전역 멤버가 있는 경우
    • 람다를 std::function에 전달할 때 이 방법을 사용하면 정품 ODR 위반이 발생하고 C1092가 발생합니다.
  • 편집하며 계속하기는 정적 라이브러리를 업데이트하지 않습니다. 정적 라이브러리를 변경하면 이전 버전에서 실행이 계속되며 경고가 발생하지 않습니다.

지원되지 않는 시나리오

C/C++용 편집 및 계속은 다음 디버깅 시나리오에서 사용할 수 없습니다.

  • /Zo로 컴파일된 네이티브 앱 디버깅(최적화된 디버깅 향상)

  • MSVC v120 도구 집합 및 C/C++ /bigobj 스위치를 사용하는 프로젝트입니다. 편집하고 계속하기 /bigobj 는 MSVC v140 이상 빌드 도구에서만 지원됩니다.

  • 혼합 모드(네이티브/관리형) 디버깅

  • JavaScript 디버깅.

  • SQL 디버깅.

  • 덤프 파일 디버깅

  • 처리되지 않은 예외의 호출 스택 해제 옵션이 선택되지 않은 경우 처리되지 않은 예외 후 코드를 편집합니다.

  • 디버그 메뉴에서 시작을 선택하여 앱을 실행하는 대신, 연결을 사용하여 앱을 디버깅합니다.

  • 최적화된 코드 디버깅

  • 빌드 오류로 인해 새 버전을 빌드하지 못한 후 이전 버전의 코드를 디버깅합니다.

  • 사용자 지정 컴파일러(cl.exe) 경로 사용 보안상의 이유로 편집하고 계속하는 동안 파일을 다시 컴파일하기 위해 Visual Studio는 항상 설치된 컴파일러를 사용합니다. 사용자 지정 컴파일러 경로(예: 파일의 사용자 지정 $(ExecutablePath) 변수 *.props 를 통해)를 사용하는 경우 경고가 표시되고 Visual Studio는 동일한 버전/아키텍처의 설치된 컴파일러를 사용하는 것으로 대체됩니다.

  • 레거시 아키텍처/MSVC 도구 집합. MSVC v140 도구 집합을 사용하는 기본 디버거는 X86 및 X64 애플리케이션 모두에서 편집 및 계속을 지원합니다. 레거시 도구 집합은 X86 애플리케이션만 지원합니다. MSVC v120보다 오래된 도구 집합은 편집하고 계속하기 위해 "디버그 > 옵션 > 일반 > 기본 호환 모드 사용"을 확인하여 레거시 디버거를 사용해야 합니다.

연결 제한 사항

편집 및 계속을 사용하지 않도록 설정하는 링커 옵션

다음 링커 옵션은 편집 및 계속을 사용하지 않도록 설정합니다.

  • /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) 파일을 만들지 못하게 하는 옵션을 설정하면 특정 경고 없이 편집 및 계속을 사용할 수 없습니다.

자동 다시 연결 제한 사항

기본적으로 편집하며 계속하기는 디버깅 세션이 끝날 때 프로그램을 다시 연결하여 up-to-date 실행 파일을 만듭니다.

원래 빌드 위치가 아닌 다른 위치에서 디버깅하는 경우 Edit and Continue는 프로그램을 다시 링크할 수 없습니다. 수동으로 다시 빌드해야 한다는 메시지가 표시됩니다.

"편집하며 계속하기" 기능은 정적 라이브러리를 다시 빌드하지 않습니다. 편집 및 계속을 사용하여 정적 라이브러리를 변경하는 경우 라이브러리를 수동으로 다시 빌드하고 이를 사용하여 앱을 다시 연결해야 합니다.

편집하며 계속하기는 사용자 지정 빌드 단계를 호출하지 않습니다. 프로그램에서 사용자 지정 빌드 단계를 사용하는 경우 사용자 지정 빌드 단계를 호출할 수 있도록 수동으로 다시 빌드하는 것이 좋습니다. 이 경우 편집 및 계속 후 다시 연결을 사용하지 않도록 설정하여 수동으로 다시 빌드하라는 메시지가 표시되도록 할 수 있습니다.

편집 및 계속 후 다시 연결을 사용하지 않으려면 다음을 수행합니다.

  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

디버그 세션을 시작할 때 이 값을 설정하면 수정 및 계속의 다양한 구성 요소가 출력 창의 > 창에 자세한 로그를 출력합니다.