programing tip

Visual Studio에서 디버그와 릴리스의 차이점은 무엇입니까?

itbloger 2020. 8. 12. 07:53
반응형

Visual Studio에서 디버그와 릴리스의 차이점은 무엇입니까?


.NET에서 가능한 중복 디버그 Visual Studio 릴리스

Visual Studio에서 디버그와 릴리스의 차이점은 무엇입니까?


가장 중요한 것은 디버그 모드에서는 최적화가없고 릴리스 모드에서는 최적화가 있다는 것입니다. 이것은 컴파일러가 매우 고급이고 코드를 매우 까다로운 저수준으로 개선 할 수 있기 때문에 중요합니다. 결과적으로 코드의 일부 행이 지침없이 남거나 일부가 모두 뒤섞 일 수 있습니다. 단계별 디버깅은 불가능합니다. 또한 로컬 변수는 종종 신비한 방식으로 최적화되므로 Watches 및 QuickWatches는 변수가 "최적화"되어 있기 때문에 작동하지 않는 경우가 많습니다. 그리고 다른 최적화도 많이 있습니다. 언젠가 최적화 된 .NET 코드를 디버깅 해보십시오.

또 다른 주요 차이점은 이로 인해 기본 릴리스 설정이 광범위한 디버그 기호 정보를 생성하는 데 신경 쓰지 않는다는 것입니다. 이 파일은 .PDB 파일이며 디버거가 어떤 어셈블리 명령이 어떤 코드 줄에 해당하는지 파악할 수있게합니다.


"Debug"및 "Release"는 실제로 빌드 및 디버깅에 영향을 줄 수있는 전체 설정에 대한 두 개의 레이블입니다.

"디버그"모드에서는 일반적으로 다음이 있습니다.

  • 프로그램 디버그 데이터베이스 파일-런타임 동안 소스에서 프로그램 실행을 매우 밀접하게 추적 할 수 있습니다.
  • 모든 최적화가 해제되어 변수 값을 검사하고 그렇지 않으면 최적화되거나 인라인되었을 수있는 함수를 추적 할 수 있습니다.
  • 릴리스와 비교하여 디버그 모드에서 다르게 작동하는 코드를 작성할 수있는 _DEBUG 전 처리기 정의 (예 : 디버깅 중에 만 사용해야하는 ASSERT를 계측하는 경우)
  • 일반적으로 실제 고객에게 배포되지 않는 디버깅 옵션을 사용하여 컴파일 된 라이브러리에 연결 (크기 및 보안상의 이유로)

"Release"모드에서는 최적화가 켜져 있고 (사용 가능한 여러 옵션이 있지만) _DEBUG 전 처리기 정의가 정의되어 있지 않습니다. 일반적으로 PDB 파일을 생성하고 싶을 것입니다. 작업이 더 빨리 실행될 때 릴리스 모드에서 "디버그"할 수있는 것이 매우 유용하기 때문입니다.


대부분 디버그에는 디버깅 할 때 유용한 추가 정보가 많이 포함되어 있습니다. 릴리스 모드에서 이것은 모두 성능을 위해 잘리고 교환됩니다.


프로젝트 컴파일 옵션을 살펴보고 비교하면 차이점이 무엇인지 알 수 있습니다.

질문이 네이티브 / C ++ 코드에 관한 것이라고 가정합니다 (구문에서 완전히 명확하지 않음).

기본적으로 디버그에서는 모든 코드 생성 최적화가 꺼져 있습니다. 일부 라이브러리 (예 : STL)는 기본적으로 더 엄격한 오류 검사 (예 : 디버그 반복기)를 사용합니다. 더 많은 디버깅 정보가 생성됩니다 (예 : "편집 및 계속"). 오류를 포착하기 위해 코드에서 더 많은 항목이 생성됩니다 (로컬 변수 값이 초기화되지 않은 패턴으로 설정되고 디버그 힙이 사용됨).


빌드 플래그는 로깅 및 "콘솔"메시징을 변경하는 데만 사용해야 하는 다른 논리를 허용 하지만 남용 될 있으며 하위 수준뿐만 아니라 실제 비즈니스 논리도 크게 변경 될 있다는 점은 매우 분명한 사실을 언급 할 가치 있습니다 .


예를 들어 MFC를 사용할 때 디버그 프로젝트는 재배포 불가능한 DLL 버전 MFC90D.DLL에 대해 링크되는 반면 릴리스 빌드는 MFC90.DLL. 이것은 아마도 다른 프레임 워크와 유사합니다.

따라서 개발되지 않은 컴퓨터에서는 디버그 빌드 응용 프로그램을 실행할 수 없습니다.


또한 디버그 모드는 디버깅에 도움이되는 많은 추가 스레드를 생성합니다. 디버거 연결 여부에 관계없이 프로세스 수명 동안 활성 상태로 유지됩니다. 여기에서 내 관련 질문을 참조 하십시오 .


분명한 차이점은 바이너리의 크기입니다. 디버그 빌드는 릴리스 빌드보다 큰 바이너리를 생성합니다.

디버그에서 컴파일 할 때 심볼 테이블이 코드 파일의 컴파일 된 객체에 추가되어 디버깅 프로그램이 이러한 바이너리를 활용하고 객체 및 변수의 값을 평가할 수 있습니다.

또 다른 눈에 띄는 차이점은 릴리스 모드에서는 디버그 모드에서 이진이 치명적인 오류로 인해 충돌이 발생한다는 것입니다. Visual Studio에서 애플리케이션 디버깅을 시작하면 잘못된 문의 정확한 위치를 알려주는 호출 스택을 확인할 수 있습니다. .


기존 릴리스 빌드 구성에서 복사 한 애플리케이션을 개발했을 때도이 질문에 대해 궁금해졌습니다. 디버그 모드에서 해당 응용 프로그램을 사용하는 데 관심이있는 개발자가 있으므로 Release 구성에서 복사 한 ReleaseMyBuild 이름으로 존재하는이 빌드 구성을 만들려면 어떻게해야하는지 궁금했습니다 (따라서 모든 설정이 릴리스 최적화에 맞게 조정되어야합니다). ) 혼란스러운 빌드 구성 이름에도 불구하고 갑자기 팀을 변경하고 디버그 빌드가됩니다. 저는 프로젝트 구성이 이름 일 뿐이며 Joris Timmermans가 언급 한 "모든 설정"을 선택하는 편리한 방법이라고 생각했습니다. "FOO"라는 빌드 구성이 최적화 된 릴리스 빌드 로 작동하도록하는 설정이 무엇인지에 대한 핵심을 알고 싶었습니다 .

다음은 VS2010의 빈 프로젝트 템플릿에서 새 VCXPROJ를 만들었습니다. 그런 다음 복사하여 둘 다 편집했습니다. 첫 번째는 디버그 내용을 유지하고 두 번째는 릴리스 내용을 유지했습니다. 관련 차이점을 중심으로 한 차이점은 다음과 같습니다.빈 VCXPROJ 디버그 대 릴리스 차이

해제

<PropertyGroup>
    <WholeProgramOptimization>true</WholeProgramOptimization>

<ClCompile>
    <Optimization>MaxSpeed</Optimization>
    <FunctionLevelLinking>true</FunctionLevelLinking>
    <IntrinsicFunctions>true</IntrinsicFunctions>
<Link>
    <EnableCOMDATFolding>true</EnableCOMDATFolding>
    <OptimizeReferences>true</OptimizeReferences>

디버그

<PropertyGroup>
    <UseDebugLibraries>true</UseDebugLibraries>`

<ClCompile>
    <Optimization>Disabled</Optimization>

흥미로운 것은 링크 섹션에서 둘 다 GenerateDebugInformationtrue로 설정되어 있습니다.


실제로 쉽게 사용할 수있는 정보가 없기 때문에 정확한 차이점이 무엇인지 모르겠습니다.

그러나 관찰 된 주요 차이점은 릴리스 버전이 결과 DLL 파일을 손상시켜 응용 프로그램, 웹 응용 프로그램을 사용할 수 없게 만든다는 것입니다.

안타깝게도 프로덕션에 디버그 빌드를 넣어야합니다. 그리고 예, 게시하려면 좋은 오래된 FTP를 사용해야합니다.

참고 URL : https://stackoverflow.com/questions/367884/what-is-the-difference-between-debug-and-release-in-visual-studio

반응형