다음을 통해 공유


릴리스 빌드를 만들 때의 일반적인 문제

개발 과정에서는 일반적으로 프로젝트의 디버그 빌드를 사용하여 빌드하고 테스트합니다. 그런 다음 릴리스 빌드용 애플리케이션을 빌드하면 액세스 위반이 발생할 수 있습니다.

아래 목록은 디버그 빌드와 릴리스(비 디버그) 빌드 간의 주요 차이점을 보여 줍니다. 다른 차이점이 있지만, 다음은 애플리케이션이 디버그 빌드에서는 작동하고 릴리스 빌드에서는 실패하게 되는 주요 차이점입니다.

디버그 빌드에서 릴리스 빌드 오류를 catch하는 방법에 대한 자세한 내용은 /GZ(디버그 빌드에서 릴리스 빌드 오류 Catch) 컴파일러 옵션을 참조하세요.

힙 레이아웃

애플리케이션이 디버그 빌드에서는 작동하지만 릴리스 빌드에서는 작동하지 않는 경우 힙 레이아웃이 문제의 원인 중 약 90%를 차지합니다.

프로젝트를 디버그용으로 빌드할 때는 디버그 메모리 할당자를 사용합니다. 즉, 모든 메모리 할당 주위에 가드 바이트가 배치됩니다. 이러한 가드 바이트는 메모리 덮어쓰기를 검색합니다. 힙 레이아웃은 릴리스 버전과 디버그 버전 간에 다르므로 메모리 덮어쓰기가 디버그 빌드에서 문제를 만들지 않을 수 있지만 릴리스 빌드에서 심각한 영향을 미칠 수 있습니다.

자세한 내용은 메모리 덮어쓰기 확인디버그 빌드를 사용하여 메모리 덮어쓰기 확인을 참조하세요.

컴파일

릴리스용으로 빌드할 때 많은 MFC 매크로와 대부분의 MFC 구현이 변경됩니다. 특히 ASSERT 매크로는 릴리스 빌드에서 nothing으로 평가되므로 ASSERT에 있는 코드는 실행되지 않습니다. 자세한 내용은 ASSERT 문 검사를 참조하세요.

일부 함수는 릴리스 빌드에서 속도를 개선하기 위해 인라인 처리됩니다. 릴리스 빌드에서는 일반적으로 최적화가 사용됩니다. 다른 메모리 할당자도 사용됩니다.

포인터 지원

디버깅 정보가 없으면 애플리케이션에서 패딩이 제거됩니다. 릴리스 빌드에서는 스트레이 포인터가 디버그 정보를 가리키는 대신 초기화되지 않은 메모리를 가리킬 가능성이 높습니다.

최적화

특정 코드 세그먼트의 특성에 따라 최적화 컴파일러는 예기치 않은 코드를 생성할 수 있습니다. 이는 릴리스 빌드 문제 중 가장 가능성이 낮은 원인이지만 때때로 발생합니다. 해결 방법은 코드 최적화를 참조하세요.

참고 항목

릴리스 빌드
릴리스 빌드 문제 해결