이 문서에서는 최적화된 코드를 더 잘 디버그할 수 있도록 설정할 컴파일러 스위치를 설명합니다.
최적화된 코드의 속도를 유지하면서 최적화된 코드를 최적화되지 않은 것처럼 디버그할 수 있는 Visual Studio 2022 버전 17.14부터 더 나은 환경을 사용할 수 있습니다. 자세한 내용은 C++ 동적 디버깅(미리 보기)참조하세요.
비고
표시되는 대화 상자 및 메뉴 명령은 활성 설정 또는 버전에 따라 도움말에 설명된 것과 다를 수 있습니다. 설정을 변경하려면 도구 메뉴에서 설정 가져오기 및 내보내기 선택합니다. 자세한 내용은 모든 설정을 다시 설정참조하세요.
비고
/Zo(최적화된 디버깅 향상) 컴파일러 옵션(Visual Studio 업데이트 3에 도입됨)은 최적화된 코드(/Od 컴파일러 옵션으로 빌드되지 않은 프로젝트)에 대한 보다 풍부한 디버깅 정보를 생성합니다. /O 옵션(코드 최적화)을 참조하세요. 여기에는 지역 변수 및 인라인 함수 디버깅에 대한 향상된 지원이 포함됩니다.
/Zo 컴파일러 옵션을 사용하면 편집하며 계속하기 기능을 사용할 수 없습니다.
컴파일러가 코드를 최적화하면 명령의 위치를 변경하고 다시 구성합니다. 이렇게 하면 보다 효율적으로 컴파일된 코드가 생성됩니다. 이 다시 정렬로 인해 디버거는 명령 집합에 해당하는 소스 코드를 항상 식별할 수 없습니다.
최적화는 다음에 영향을 줄 수 있습니다.
최적화 프로그램은 지역 변수를 제거하거나 디버거가 이해하지 못하는 위치로 이동할 수 있습니다.
최적화 프로그램에서 코드 블록을 병합할 때 변경되는 함수 내의 위치입니다.
호출 스택의 프레임에 대한 함수 이름입니다. 최적화 프로그램에서 두 함수를 병합하는 경우 잘못된 것일 수 있습니다.
그러나 모든 프레임에 대한 기호가 있다고 가정하면 호출 스택에 표시되는 프레임은 거의 항상 정확합니다. 스택 손상이 있거나, 어셈블리 언어로 작성된 함수가 있거나, 호출 스택에 일치하는 기호가 없는 운영 체제 프레임이 있는 경우 호출 스택의 프레임이 잘못됩니다.
전역 및 정적 변수는 항상 올바르게 표시됩니다. 구조 레이아웃도 마찬가지입니다. 구조체에 대한 포인터가 있고 포인터 값이 올바르면 구조체의 모든 멤버 변수에 올바른 값이 표시됩니다.
이러한 제한 사항으로 인해 가능한 경우 최적이 아닌 버전의 프로그램을 사용하여 디버그해야 합니다. 기본적으로 C++ 프로그램의 디버그 구성에서 최적화가 해제되고 릴리스 구성에서 설정됩니다.
그러나 버그가 프로그램의 최적화된 버전에만 나타날 수 있습니다. 이 경우 최적화된 코드를 디버그해야 합니다.
디버그 빌드 구성에서 최적화를 설정하려면
새 프로젝트를 만들 때 대상을
Win32 Debug
선택합니다. 프로그램이 완전히 디버그되고Win32 Release
대상을 빌드할 준비가 될 때까지Win32 Debug
대상을 사용합니다. 컴파일러는 대상을Win32 Debug
최적화하지 않습니다.솔루션 탐색기에서 프로젝트를 선택합니다.
보기 메뉴에서 속성 페이지클릭합니다.
속성 페이지 대화 상자에서 구성 드롭다운 목록이
Debug
선택되어 있는지 확인합니다.왼쪽의 폴더 보기에서 C/C++ 폴더를 선택합니다.
C++ 폴더 아래에서 .를 선택합니다
Optimization
.오른쪽의 속성 목록에서
Optimization
을 찾으세요. 옆에 있는 설정은 아마Disabled (
/Od)
일 것 같습니다. 다른 옵션(Minimum Size``(
/O1)
, /O2)
,Maximum Speed``(
Full Optimization``(
/Ox)
또는Custom
) 중 하나를 선택합니다.Custom
옵션을 선택한Optimization
경우, 이제 속성 목록에 표시된 다른 속성에 대한 옵션을 설정할 수 있습니다.프로젝트 속성 페이지의 구성 속성, C/C++, 명령줄 노드를 선택하고 추가 옵션 텍스트 상자에 /Zo
)
를 추가(
합니다.경고
추가
/Zo
하면 편집 및 계속이 비활성화됩니다.최적화된 코드를 디버그할 때 디스어셈블리 창을 사용하여 생성 및 실행되는 지침을 확인합니다. 중단점을 설정할 때 중단점이 명령과 함께 이동할 수 있음을 알아야 합니다. 예를 들어 다음 코드를 고려합니다.
for (x=0; x<10; x++)
이 줄에서 중단점을 설정한다고 가정합니다. 중단점이 10번 적중될 것으로 예상할 수 있지만 코드가 최적화된 경우 중단점이 한 번만 적중됩니다. 첫 번째 명령이 값을 x
0으로 설정하기 때문입니다. 컴파일러는 이 작업을 한 번만 수행해야 한다는 것을 인식하고 루프 밖으로 이동합니다. 중단점이 함께 이동합니다. 비교하고 증분 x
하는 지침은 루프 내에 남아 있습니다.
디스어셈블리 창을 볼 때 단계 단위는 더 큰 제어를 위해 명령으로 자동으로 설정되며, 최적화된 코드를 단계별로 실행할 때 유용합니다.